Перейти к содержанию

Не Отправляется 0X00 По Uart


ramil93

Рекомендуемые сообщения

Массив - это данные , к которым можно обращаться по индексу.

А строка - просто данные из текстом , к которым нельзя обратиться , к примеру: к 5-му символу , или 6-му. :)

Блин а вот это сообщение я пропустил но потом поржал канечно. как это в строке к символу по индексу нельзя обратиться? - выпал в осадок
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

так я проэто и пытаюсь объснить
Чем, вот этим

char строка [] = {'s','r'}

printf (&строка)

вот так работает и кто скажет что массив не строка

?

Тут у Вас даже нулевого символа нет. Неработоспособность гарантирована :)

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Я успел рубонуть тот пост.

А как вы обратитесь напрямую? к 5-му символу?

Чтоб к нему обратиться , нужно прочитать всю строку , верно? Или я не прав?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я успел рубонуть тот пост.

А как вы обратитесь напрямую? к 5-му символу?

Чтоб к нему обратиться , нужно прочитать всю строку , верно? Или я не прав?

нет вы не правы

string строка = "строка"

char символ = строка [5];

Ссылка на комментарий
Поделиться на другие сайты

artos5, для ясности выложите код, где показаны строка, к элементу которой нельзя обратиться. Насколько мне известно - любая строка в Си - есть массив char и никак иначе. Соответственно и обратится можно к любому символу аналогично обращению к индексу массива.

*опередили

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

так я проэто и пытаюсь объснить
Чем, вот этим

char строка [] = {'s','r'}

printf (&строка)

вот так работает и кто скажет что массив не строка

?

Тут у Вас даже нулевого символа нет. Неработоспособность гарантирована :)

Ну и символ "&" не нужен. Имя массива - есть указатель на него.

ЗЫ: Оверквотинг сделал спецом, чтобы понятно было к чму относится мой текст. Так что не нужно ругаться :)

Ссылка на комментарий
Поделиться на другие сайты

Откопал свой исходник древний.

Вот так я отправлял в ком порт:

  data_print = data_print+0x30;

   putchar(data_print);  // десятые жир 

   data_m = data_m+0x30;

   putchar(data_m);  // сотые жир 

   data_print=0;  

чтобы отправить число 10,02 я отправлял четыре байта.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Тут у Вас даже нулевого символа нет. Неработоспособность гарантирована :)

Можно я вставлю свои 5 копеек? :) Работать будет, только не так как задумано. Ноль рано или поздно попадётся позже... интересно конечно, что случится, если в памяти ни одного нуля не окажется... но это уже вопрос к надёжности функции printf...

Ссылка на комментарий
Поделиться на другие сайты

Тогда только один выход: отказаться от функции. И написать свою.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Можно я вставлю свои 5 копеек? Работать будет, только не так как задумано. Ноль рано или поздно попадётся позже... интересно конечно, что случится, если в памяти ни одного нуля не окажется... но это уже вопрос к надёжности функции printf...
Ну если что-то работает не так как нужно, то это уже - не работает :)

А printf , думаю, не разбирается в количестве символов. Будет пыхтеть до усёру :)

Ссылка на комментарий
Поделиться на другие сайты

Автор. Сделайте перебор массива через цикл, и отправляйте поштучно символы putchar-ом - так должно прокатить.

Можете заодно отдельно putchar-ом 0x00 отправить сначала - должен отправляться без проблем.

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

0x30 это символ нуль, а мне нужен hex код 0x00.

Тут всё зависит от обработки на принимаемой стороне. Можно отправить "0123456789" и обработать на приёме эту строку, преобразовав её в соответствующие числа/значения.
Ссылка на комментарий
Поделиться на другие сайты

Да сделайте ему пример, который весь массив циклом перебирает и через putchar выстреливает по одному индексу :) Самое простое решение. Только вместо нуля сделать другой символ, завершающий "строку" или заведомо фиксированную длинну "пакета" сделать.

Ссылка на комментарий
Поделиться на другие сайты

Да сделайте ему пример, который весь массив циклом перебирает и через putchar выстреливает по одному индексу :) Самое простое решение.

Думаю, что он сам до этого допрёт, если смог такой код начивиркать :)
Ссылка на комментарий
Поделиться на другие сайты

Такой код сгенерирован CVAVR'ом

Сделал:

for (i=0;i<=7;i++)

{

putchar(string);

};

Прекрасно работает, Спасибо

Изменено пользователем ramil93
Ссылка на комментарий
Поделиться на другие сайты

void putstr(char* str){
unsigned char len = strlen(str);
while(len--) putchar(*str++);
........
........
putstr(string);
}

или так, без strlen

void putstr(char* str, unsigned char len){
while(len--)  putchar(*str++);
}
........
........
putstr(string, sizeof(string));

Ссылка на комментарий
Поделиться на другие сайты

strlen

А он случаем не по 0x00 длину строки определяет? :) Т.е. при таком раскладе та же проблема. Но поскольку у него фиксированная длина, for является исчерпывающим средством)

Ссылка на комментарий
Поделиться на другие сайты

А он случаем не по 0x00 длину строки определяет?
Да, кстати. Не прокатит такой вариант. Тупанул :)

Значит первый варинат для строки, второй для данных.

ЗЫ: И всётаки, с sizeof вариант лучше. Пусть компилятор сам высчитывает размер массива. Сменил данные и не паришься о размере.

Ссылка на комментарий
Поделиться на другие сайты

Всем привет!

Как принимать данные USART-om микроконтроллера чтоб программа при этом не тормозила?

Ничего не получается......

как только прописал такую строчку:

data = getchar();

так прога и зависла на этой строчке.

всему виной цикл while в функции.

Сейчас код кодвижен вы*рал такой:

interrupt [uSART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) {
rx_wr_index=0;
};

if (++rx_counter == RX_BUFFER_SIZE)
 {
 rx_counter=0;
 rx_buffer_overflow=1;
 printf("TDR %d ", rx_buffer);
 };
};


}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif		

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Блин , даже такой код не принимает "ОК" . Хотя с другой стороны он выдается ....

#include <mega8.h>
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 100
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [uSART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
  rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256
  // special case for receiver buffer size=256
  if (++rx_counter == 0) rx_buffer_overflow=1;
#else
  if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
  if (++rx_counter == RX_BUFFER_SIZE)
  {
  rx_counter=0;
  rx_buffer_overflow=1;
  }
#endif
  }
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
char data[] = "12345";
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
  {
  // Place your code here 
    if(getchar()=="OK")
    printf("data_data_string_string\n\r");
  }
}

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

используйте прерывание. тогда функция приема и передачи будет вызываться только тогда когда принят или передан байт. и забудьте вы про сви put И get напрямую посылайте в порт

Изменено пользователем hasl
Ссылка на комментарий
Поделиться на другие сайты

if(getchar()=="OK")

Ну вообще, getchar принимает символ, а не строку :)

Да и в Си нельзя сравнивать строки, скорее всего будут сравниваться указатели на эти строки.

Ну и для printf нужна функция putchar, для посимвольного вывода. Иначе куда он будет перенаправлять вывод, одному богу... разработчику компилятора известно :)

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...