Прием строки из UART вопросы
Прием строки из UART вопросы
Привет, Коты!
Начал вкуривать недавно контроллеры, поэтому прошу не бить. Что-то уже начало получаться и пришел я к USART
По поводу отправки символов и строк проблем нет никаких, а вот никак не могу принять строку.
Перечитал уже много. начиная от avr123 и easyelectroncs до enablechip.ru.
Наваял такую тестовую прогу. не идет. Дайте советы, голова опухла.
Начал вкуривать недавно контроллеры, поэтому прошу не бить. Что-то уже начало получаться и пришел я к USART
По поводу отправки символов и строк проблем нет никаких, а вот никак не могу принять строку.
Перечитал уже много. начиная от avr123 и easyelectroncs до enablechip.ru.
Наваял такую тестовую прогу. не идет. Дайте советы, голова опухла.
- Вложения
-
- 5th UART.rar
- Проект для CVAVR
- (38.74 КБ) 243 скачивания
- Реклама
Re: Прием строки из UART вопросы
Все переменные, которые модифицируются в прерывании объяви с volatile.
В прерывании по приему байта читать UDR обязательно!, даже если был какой-нить флаг ошибки.
В прерывании по приему байта читать UDR обязательно!, даже если был какой-нить флаг ошибки.
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: Прием строки из UART вопросы
Т.е. так?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;
}
}
Re: Прием строки из UART вопросы
Код: Выделить всё
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status;
А про UDR - проще добавить временную переменную.
Код: Выделить всё
char tmpData;
tmpData=UDR;
status=UCSRA;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
.....
usartRxBuf[rxBufTail] = tmpData;
.....
Флаг прерывания RXC сбрасывается только при прочтении UDR, а не входом в прерывание. То есть если UDR не прочитать, то по окончании прерывания - снова попадем в него...legalize писал(а):Но что-то помоему прерывание обрабатывается постояннои читается UDR. а символ не получен
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: Прием строки из UART вопросы
Извини, поспешил... так правильней.md5sum писал(а):Код: Выделить всё
char tmpData; status=UCSRA; // Флаги ошибок читать до UDR tmpData=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) ..... usartRxBuf[rxBufTail] = tmpData; .....
USCRA нужно прочитать до UDR!
— Не говорите мне что делать и я не скажу куда Вам идти...
- Реклама
Re: Прием строки из UART вопросы
Блин, нифига Proteus пишет:
[AVR UASRT] Reading UDR, while data no recieved.
[AVR MEMORY] Writing to memory location 0x11d outside of memory size.
Я ничего не посылаю, вылетает читать из UDR сразу сам.

[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 вопросы
"Никогда не читайте перед обедом большевистских газет".legalize писал(а):начиная от avr123
ICQ нет, и, в ближайшее время, не будет.
Re: Прием строки из UART вопросы
Последний вариант исходника покажи.legalize писал(а):Я ничего не посылаю, вылетает читать из UDR сразу сам.
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: Прием строки из UART вопросы
Вооот!
- Вложения
-
- 5th uart.c
- Исходник полностью
- (6.19 КБ) 587 скачиваний
Re: Прием строки из UART вопросы
Тоже не вижу проблем с прерыванием по приему...
Протеус, интересно, его нормально эмулирует?
Простое эхо не делали?
Остальное убрать (оставив инициализацию порта)
Протеус, интересно, его нормально эмулирует?
Простое эхо не делали?
Код: Выделить всё
interrupt [USART_RXC] void usart_rx_isr(void)
{
char tmp;
tmp=UDR;
UDR=tmp;
}
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: Прием строки из UART вопросы
Да блин не доходит до эхо. Только запуская симуляцию и погнали ошибки.
А вот по последнему посту все работает четко. Эхо проходит.
Когда убрал все из основного цикла ошибки пропали, т.е значит я не правильно читал из буфера??
Вот это же должно мне выдавать кол-во символов в буфере
А вот по последнему посту все работает четко. Эхо проходит.
Когда убрал все из основного цикла ошибки пропали, т.е значит я не правильно читал из буфера??
Код: Выделить всё
delay_ms(500);
rxBufCount = USART_GetRxCount();
putchar(rxBufCount);
Re: Прием строки из UART вопросы
Пара поправок и надо переходить к отладке в железе.
тут не окончания цикла. Или я не нашел, где в передаваемой строке последний байт обнуляется! А если примем 16 байт?, то *text в след. итерации получит значение следующего байта какой-то другой переменной.
поправить на
Код: Выделить всё
void usart_SendStr (unsigned char *text)
{
unsigned char sym;
while (*text)
{
sym = *text++;
putchar (sym);
}
}
Код: Выделить всё
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);
}— Не говорите мне что делать и я не скажу куда Вам идти...
Re: Прием строки из UART вопросы
Ну дык это же указатель на массив while будет выполняться пока не будет прочитан символ конца строки. А конец массива '/0'md5sum писал(а):тут не окончания цикла. Или я не нашел, где в передаваемой строке последний байт обнуляется! А если примем 16 байт?, то *text в след. итерации получит значение следующего байта какой-то другой переменной.
тут вроде работает.
Ну что-то есть
А что это за строка такая?
md5sum писал(а):Код: Выделить всё
if ((rxBufCount = USART_GetRxCount())) { //!!!!!!!!!
Re: Прием строки из UART вопросы
Хм.. не уверен... Если только CV ТАК делает.legalize писал(а):Ну дык это же указатель на массив while будет выполняться пока не будет прочитан символ конца строки. А конец массива '/0'
С какой стати /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)Оператор присваивания возвращает присвоенное значение.legalize писал(а): А что это за строка такая?md5sum писал(а):Код: Выделить всё
if ((rxBufCount = USART_GetRxCount())) { //!!!!!!!!!
Строка расшифровывается так: если в rxBufCount занесено значение отличное от 0, то выполнять... Двойные скобки - указывают компилятору, что программист осознанно использует данную конструкцию. С одинарными скобками скорее всего получим WARNING.
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: Прием строки из UART вопросы
Накидал простенький тест - прием текстовой строки по UART и отправка ее обратно.
Прием и передача в прерываниях.
Правда у меня тестовый МК - мега32, и исходник под AVR-GCC (WinAVR), но если интересно, могу выложить.
PS я не пользую протеус, а в железе работает.
Прием и передача в прерываниях.
Правда у меня тестовый МК - мега32, и исходник под AVR-GCC (WinAVR), но если интересно, могу выложить.
PS я не пользую протеус, а в железе работает.
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: Прием строки из UART вопросы
Выложи пожалуйста,
32-й меги нету, но на 8-ю, думаю, вставлю!!! Я тут уезжал на три дня на природу. От Атмела 
Про "/0" прочитал у Лебедева. "Пособие по CVAVR": "! Следует учитывать, что в символьном литерале (Строковой переменной. символьном массиве) находится на один элемент больше, т.к. последний из элементов является управляющей последовательностью '/0' ".
Вот!
И кстати по передаче работает по нулю. ХЗ.
Про "/0" прочитал у Лебедева. "Пособие по CVAVR": "! Следует учитывать, что в символьном литерале (Строковой переменной. символьном массиве) находится на один элемент больше, т.к. последний из элементов является управляющей последовательностью '/0' ".
Вот!
И кстати по передаче работает по нулю. ХЗ.
Re: Прием строки из UART вопросы
Ну и правильно работает: на передачу небось строку указывал? В кавычках/апострофах?legalize писал(а):Про "/0" прочитал у Лебедева. "Пособие по CVAVR": "! Следует учитывать, что в символьном литерале (Строковой переменной. символьном массиве) находится на один элемент больше, т.к. последний из элементов является управляющей последовательностью '/0' ".
Вот!
И кстати по передаче работает по нулю. ХЗ.
(судя по закомментированным строкам в исходнике
- Вложения
-
- main.zip
- (1.06 КБ) 302 скачивания
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: Прием строки из UART вопросы
md5sum писал(а):Накидал простенький тест - прием текстовой строки по UART и отправка ее обратно.
Прием и передача в прерываниях.
Правда у меня тестовый МК - мега32, и исходник под AVR-GCC (WinAVR), но если интересно, могу выложить.
PS я не пользую протеус, а в железе работает.
Можно ли проект посмотреть
Re: Прием строки из UART вопросы
Так а определял же как неопределенный массив (тафтология)
, или я не правильно понял 
Да кстати с одинарными скобками не работает!
Спасибо за архив!
Да кстати с одинарными скобками не работает!
Спасибо за архив!


