Страница 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
уберите это

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

delay_ms(3000);
и сделайте через таймер. Получается пока 3 сек задержка не выполнится из прерывания вы не выйдете. А представьте сколько данных по uart за 3 сек вы можете пропустить. Либо разрешите прерывания внутри этого прерывания. Но вложенные прерывания - это отдельная тема, с ними надо быть очень осторожным...

Re: Прием строки по UART с помощью прерываний

Добавлено: Сб ноя 09, 2013 01:18:16
legalize
Посмотри в моей теме, в этой же ветке. Может что прояснится

Re: Прием строки по UART с помощью прерываний

Добавлено: Сб ноя 09, 2013 09:46:41
zero648
Вот это, я, бы тоже в main выкинул:

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

    send_lcd(set_first_line, UART_buffer);  
Короче, все что не касается приема, все нужно выкинуть в 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);
} 
вы ведь не используете сам буфер между прибавлением числа и обнулением индекса :dont_know:
Тут можно почитать про обмен данными через UART