Страница 1 из 1
Прием строки по UART с помощью прерываний
Добавлено: Вт ноя 05, 2013 17:47:53
kushman
Добрый день!
Набросал небольшую функцию приема строки с помощью прерываний, код приведен ниже. Конец строки определяется по задержке в 3 секунды. Все в принципе работает, за исключением того, что принимаются только 3 символа. При отправке строки ABCD на экран выводится ABD и т.д.
Что я делаю не так?)
Код: Выделить всё
unsigned char UART_buffer[16];
interrupt [USART_RXC] void UART_Receive(void) {
UART_buffer[i]=UDR;
i++;
SREG.7=1;
UCSRA.7=1;
UCSRB.7=1;
send_lcd(set_first_line, UART_buffer);
delay_ms(3000);
i=0;
}
Re: Прием строки по UART с помощью прерываний
Добавлено: Вт ноя 05, 2013 18:03:48
blackx
Не знаю точно, отчего вы получаете такое поведение. Однако, не зря рекомендуют делать процедуры прерываний как можно более короткими в плане времени выполнения. У вас же прямо в прерывании задержка поставлена - так делать нельзя.
Лучше всего сделать разделение строк по символам переноса строки - "\r\n" (CR LF) или просто "\n" (LF).
Re: Прием строки по UART с помощью прерываний
Добавлено: Вт ноя 05, 2013 19:02:12
eess9
уберите это
и сделайте через таймер. Получается пока 3 сек задержка не выполнится из прерывания вы не выйдете. А представьте сколько данных по uart за 3 сек вы можете пропустить. Либо разрешите прерывания внутри этого прерывания. Но вложенные прерывания - это отдельная тема, с ними надо быть очень осторожным...
Re: Прием строки по UART с помощью прерываний
Добавлено: Сб ноя 09, 2013 01:18:16
legalize
Посмотри в моей теме, в этой же ветке. Может что прояснится
Re: Прием строки по UART с помощью прерываний
Добавлено: Сб ноя 09, 2013 09:46:41
zero648
Вот это, я, бы тоже в main выкинул:
Короче, все что не касается приема, все нужно выкинуть в main.
Re: Прием строки по UART с помощью прерываний
Добавлено: Вт ноя 12, 2013 18:33:06
kushman
Решил проблему очень просто, сделал свою функции задержки, которая состоит из пустых циклов. Понимаю, что это не совсем правильно и корректно, но вот нижеприведенный код прекрасно работает) Следующим шагом сделаю остановку приема по символу конца строки.
Код: Выделить всё
interrupt [USART_RXC] void UART_Receive(void) {
UART_buffer[i]=UDR;
i++;
SREG.7=1;
UCSRA.7=1;
UCSRB.7=1;
delay();
i=0;
send_lcd(set_first_line, UART_buffer);
}
Re: Прием строки по UART с помощью прерываний
Добавлено: Чт ноя 21, 2013 14:57:18
vitalik_1984
А зачем вообще эта задержка в прерывании, разрешите узнать?
Код: Выделить всё
interrupt [USART_RXC] void UART_Receive(void) {
UART_buffer[i]=UDR;
i++; //Две ненужные команды это первая
SREG.7=1;
UCSRA.7=1;
UCSRB.7=1;
delay(); //Это третья :)))
i=0; //Это вторая :)
send_lcd(set_first_line, UART_buffer);
}
вы ведь не используете сам буфер между прибавлением числа и обнулением индекса
Тут можно почитать про обмен данными через UART