Прием строки из UART вопросы

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
legalize
Открыл глаза
Сообщения: 69
Зарегистрирован: Чт авг 11, 2011 12:59:42
Откуда: Луганск

Прием строки из UART вопросы

Сообщение legalize »

Привет, Коты!
Начал вкуривать недавно контроллеры, поэтому прошу не бить. Что-то уже начало получаться и пришел я к USART
По поводу отправки символов и строк проблем нет никаких, а вот никак не могу принять строку.
Перечитал уже много. начиная от avr123 и easyelectroncs до enablechip.ru.
Наваял такую тестовую прогу. не идет. Дайте советы, голова опухла.
Вложения
5th UART.rar
Проект для CVAVR
(38.74 КБ) 243 скачивания
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прием строки из UART вопросы

Сообщение md5sum »

Все переменные, которые модифицируются в прерывании объяви с volatile.
В прерывании по приему байта читать UDR обязательно!, даже если был какой-нить флаг ошибки.
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Аватара пользователя
legalize
Открыл глаза
Сообщения: 69
Зарегистрирован: Чт авг 11, 2011 12:59:42
Откуда: Луганск

Re: Прием строки из UART вопросы

Сообщение legalize »

md5sum писал(а):Все переменные, которые модифицируются в прерывании объяви с volatile.
В прерывании по приему байта читать UDR обязательно!, даже если был какой-нить флаг ошибки.
Т.е. так?

Код: Выделить всё

// USART Receiver buffer
#define RX_BUFFER_SIZE 16
volatile char usartRxBuf[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
volatile unsigned char rxBufTail,rxBufHead,rxCount;
#else
volatile unsigned int rxBufTail,rxBufHead,rxCount;
#endif

interrupt [USART_RXC] void usart_rx_isr(void)
{
volatile char status, BadData;
status=UCSRA;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   if (rxCount < RX_BUFFER_SIZE)
          {
          usartRxBuf[rxBufTail] = UDR;
          rxBufTail ++;
          if (rxBufTail == RX_BUFFER_SIZE) rxBufTail = 0;
          rxCount ++;
          }
    }
else
        {
        BadData = UDR;
        }
}
Но что-то помоему прерывание обрабатывается постоянно :( и читается UDR. а символ не получен
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прием строки из UART вопросы

Сообщение md5sum »

Код: Выделить всё

interrupt [USART_RXC] void usart_rx_isr(void)
{
char status;
Тут volatile не нужно :)
А про UDR - проще добавить временную переменную.

Код: Выделить всё

char tmpData;
tmpData=UDR;
status=UCSRA;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
.....
usartRxBuf[rxBufTail] = tmpData;
.....
legalize писал(а):Но что-то помоему прерывание обрабатывается постоянно :( и читается UDR. а символ не получен
Флаг прерывания RXC сбрасывается только при прочтении UDR, а не входом в прерывание. То есть если UDR не прочитать, то по окончании прерывания - снова попадем в него...
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прием строки из UART вопросы

Сообщение md5sum »

md5sum писал(а):

Код: Выделить всё

char tmpData;
status=UCSRA; // Флаги ошибок читать до UDR
tmpData=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
.....
usartRxBuf[rxBufTail] = tmpData;
.....
Извини, поспешил... так правильней.
USCRA нужно прочитать до UDR!
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Аватара пользователя
legalize
Открыл глаза
Сообщения: 69
Зарегистрирован: Чт авг 11, 2011 12:59:42
Откуда: Луганск

Re: Прием строки из UART вопросы

Сообщение legalize »

Блин, нифига Proteus пишет:
[AVR UASRT] Reading UDR, while data no recieved.
[AVR MEMORY] Writing to memory location 0x11d outside of memory size.

Я ничего не посылаю, вылетает читать из UDR сразу сам.

:(
Реклама
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Прием строки из UART вопросы

Сообщение Dmitry Dubrovenko »

legalize писал(а):начиная от avr123
"Никогда не читайте перед обедом большевистских газет". :)
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прием строки из UART вопросы

Сообщение md5sum »

legalize писал(а):Я ничего не посылаю, вылетает читать из UDR сразу сам.
:(
Последний вариант исходника покажи.
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
legalize
Открыл глаза
Сообщения: 69
Зарегистрирован: Чт авг 11, 2011 12:59:42
Откуда: Луганск

Re: Прием строки из UART вопросы

Сообщение legalize »

Вооот!
Вложения
5th uart.c
Исходник полностью
(6.19 КБ) 587 скачиваний
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прием строки из UART вопросы

Сообщение md5sum »

Тоже не вижу проблем с прерыванием по приему...
Протеус, интересно, его нормально эмулирует?
Простое эхо не делали?

Код: Выделить всё

interrupt [USART_RXC] void usart_rx_isr(void)
{
char tmp;
tmp=UDR;
UDR=tmp;
}
Остальное убрать (оставив инициализацию порта)
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
legalize
Открыл глаза
Сообщения: 69
Зарегистрирован: Чт авг 11, 2011 12:59:42
Откуда: Луганск

Re: Прием строки из UART вопросы

Сообщение legalize »

Да блин не доходит до эхо. Только запуская симуляцию и погнали ошибки.

А вот по последнему посту все работает четко. Эхо проходит. :)

Когда убрал все из основного цикла ошибки пропали, т.е значит я не правильно читал из буфера??

Код: Выделить всё

      delay_ms(500);
      rxBufCount = USART_GetRxCount();  
      putchar(rxBufCount);
Вот это же должно мне выдавать кол-во символов в буфере
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прием строки из UART вопросы

Сообщение md5sum »

Пара поправок и надо переходить к отладке в железе. :)

Код: Выделить всё

void usart_SendStr (unsigned char *text)
{
unsigned char sym;
while (*text)
        {
        sym = *text++;
        putchar (sym);
        }
}
тут не окончания цикла. Или я не нашел, где в передаваемой строке последний байт обнуляется! А если примем 16 байт?, то *text в след. итерации получит значение следующего байта какой-то другой переменной.

Код: Выделить всё

while (1)
      {
      unsigned int rxBufCount, i;
      unsigned char rcvDataStr[16];
      rxBufCount = USART_GetRxCount();
      for (i = 0; i < ( rxBufCount - 1); i++)
            {
            rcvDataStr[i] = getchar();
            }
      
      USART_FlushRxBuf();      
      
      usart_SendStr(rcvDataStr);
      delay_ms(500);
      }[b];[/b] /* зачем ; ? */
поправить на

Код: Выделить всё

while (1)
      {
      unsigned int rxBufCount, i;
      unsigned char rcvDataStr[16];
      if ((rxBufCount = USART_GetRxCount())) { //!!!!!!!!!
      for (i = 0; i < ( rxBufCount - 1); i++)
            {
            rcvDataStr[i] = getchar();
            }
      USART_FlushRxBuf();      
      usart_SendStr(rcvDataStr);
      }
      delay_ms(500);
      }
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
legalize
Открыл глаза
Сообщения: 69
Зарегистрирован: Чт авг 11, 2011 12:59:42
Откуда: Луганск

Re: Прием строки из UART вопросы

Сообщение legalize »

md5sum писал(а):тут не окончания цикла. Или я не нашел, где в передаваемой строке последний байт обнуляется! А если примем 16 байт?, то *text в след. итерации получит значение следующего байта какой-то другой переменной.
Ну дык это же указатель на массив while будет выполняться пока не будет прочитан символ конца строки. А конец массива '/0'
тут вроде работает.

Ну что-то есть :)
А что это за строка такая?
md5sum писал(а):

Код: Выделить всё

if ((rxBufCount = USART_GetRxCount())) { //!!!!!!!!!
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прием строки из UART вопросы

Сообщение md5sum »

legalize писал(а):Ну дык это же указатель на массив while будет выполняться пока не будет прочитан символ конца строки. А конец массива '/0'
Хм.. не уверен... Если только CV ТАК делает.
С какой стати /0 это конец массива? разве ноль не может быть элементом массива...

Код: Выделить всё

char a[5]={'a','b','c','d','e'};
char b[5]={'1','2','3','4','5'};

После компиляции Data:         10 bytes (0.5% Full)
Тут тоже нет лишних байт...
Со строками не путаем?

Код: Выделить всё

char c[]="qwe";
Data:          4 bytes (0.2% Full)
Тут /0 добавил компилятор.

legalize писал(а): А что это за строка такая?
md5sum писал(а):

Код: Выделить всё

if ((rxBufCount = USART_GetRxCount())) { //!!!!!!!!!
Оператор присваивания возвращает присвоенное значение.
Строка расшифровывается так: если в rxBufCount занесено значение отличное от 0, то выполнять... Двойные скобки - указывают компилятору, что программист осознанно использует данную конструкцию. С одинарными скобками скорее всего получим WARNING.
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прием строки из UART вопросы

Сообщение md5sum »

Накидал простенький тест - прием текстовой строки по UART и отправка ее обратно.
Прием и передача в прерываниях.
Правда у меня тестовый МК - мега32, и исходник под AVR-GCC (WinAVR), но если интересно, могу выложить.

PS я не пользую протеус, а в железе работает.
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
legalize
Открыл глаза
Сообщения: 69
Зарегистрирован: Чт авг 11, 2011 12:59:42
Откуда: Луганск

Re: Прием строки из UART вопросы

Сообщение legalize »

Выложи пожалуйста, :beer: 32-й меги нету, но на 8-ю, думаю, вставлю!!! Я тут уезжал на три дня на природу. От Атмела :)

Про "/0" прочитал у Лебедева. "Пособие по CVAVR": "! Следует учитывать, что в символьном литерале (Строковой переменной. символьном массиве) находится на один элемент больше, т.к. последний из элементов является управляющей последовательностью '/0' ".
Вот!

И кстати по передаче работает по нулю. ХЗ.
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прием строки из UART вопросы

Сообщение md5sum »

legalize писал(а):Про "/0" прочитал у Лебедева. "Пособие по CVAVR": "! Следует учитывать, что в символьном литерале (Строковой переменной. символьном массиве) находится на один элемент больше, т.к. последний из элементов является управляющей последовательностью '/0' ".
Вот!
И кстати по передаче работает по нулю. ХЗ.
Ну и правильно работает: на передачу небось строку указывал? В кавычках/апострофах?
(судя по закомментированным строкам в исходнике :)) )
Вложения
main.zip
(1.06 КБ) 302 скачивания
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
foxit
Грызет канифоль
Сообщения: 262
Зарегистрирован: Пт ноя 16, 2007 00:40:17
Откуда: Украина

Re: Прием строки из UART вопросы

Сообщение foxit »

md5sum писал(а):Накидал простенький тест - прием текстовой строки по UART и отправка ее обратно.
Прием и передача в прерываниях.
Правда у меня тестовый МК - мега32, и исходник под AVR-GCC (WinAVR), но если интересно, могу выложить.

PS я не пользую протеус, а в железе работает.

Можно ли проект посмотреть
Аватара пользователя
legalize
Открыл глаза
Сообщения: 69
Зарегистрирован: Чт авг 11, 2011 12:59:42
Откуда: Луганск

Re: Прием строки из UART вопросы

Сообщение legalize »

Так а определял же как неопределенный массив (тафтология) :), или я не правильно понял :)

Да кстати с одинарными скобками не работает!

Спасибо за архив!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»