Остановка программы при чтении данных с UART

У меня есть этот простой код:

while(1){           
    char dolar = gps_get_char();//read char from uart
    if ((dolar == '$') || (receive_dolar == 1)){
        receive_dolar = 1;

        gps_get_nmea(nmea_in, sizeof(nmea_in));
        rozloz_nmea();

        receive_dolar = 0;
    }       

    /*control running program*/
    if (tl2 == 1){ //flag button from interrupt
        LCD ^= (1 << LED_ON_OFF);
        tl2 = 0;
    }   
}

А вот когда GPS выключен, так программа останавливается здесь:

char dolar = gps_get_char();//read char from uart

Где функция gps_get_char();

char gps_get_char()
{
    unsigned int in = 0;

    do {
        in = uart1_getc();
    } while((in & UART_NO_DATA) || (in & UART_BUFFER_OVERFLOW));

    return((char) in);
}

Есть идеи, почему программа остановлена?


person Jirka    schedule 29.04.2015    source источник
comment
Потому что !(in & UART_NO_DATA) || (in & UART_BUFFER_OVERFLOW) всегда верно в случае, с которым вы сталкиваетесь. Что вы пробовали?   -  person Eregrith    schedule 29.04.2015
comment
Я хотел проверить, доступны ли данные. Извините, это хорошее условие: while((in & UART_NO_DATA) || (in & UART_BUFFER_OVERFLOW));   -  person Jirka    schedule 29.04.2015
comment
Что вы пытались сделать со своей проблемой? Пробовали использовать отладчик? Вы пробовали что-нибудь?   -  person Eregrith    schedule 29.04.2015
comment
К сожалению. У меня нет отладчика. :(   -  person Jirka    schedule 29.04.2015
comment
Вы программируете на Windows или на Linux? Есть легкодоступные отладчики, такие как gdb   -  person Eregrith    schedule 29.04.2015
comment
Извиняюсь. Эта программа для ATmega128. Среда программирования AVR Studio 6.2.   -  person Jirka    schedule 29.04.2015
comment
Ну, я думаю, что AVR Studio имеет встроенный отладчик. Просто выполните простой поиск...   -  person Eregrith    schedule 29.04.2015
comment
Это состояние плохое. в то время как ((в & UART_NO_DATA) || (в & UART_BUFFER_OVERFLOW))   -  person Jirka    schedule 29.04.2015
comment
Программист без отладчика подобен таксисту без машины... как вообще можно работать, если у вас нет отладчика?   -  person Lundin    schedule 29.04.2015
comment
Проблему я нашел и устранил без отладчика. Достаточно было добавить это условие if ((dolar = uart1_getc()) != UART_NO_DATA)   -  person Jirka    schedule 29.04.2015
comment
Мы понятия не имеем, в чем была ваша проблема. Вы не дали нам ничего для работы.   -  person Eregrith    schedule 29.04.2015


Ответы (1)


Даже если ваш текущий подход работает, вы склонны к потере данных UART. Вы действительно должны использовать прерывания вместо опроса. Пусть прерывание заполнит достаточно большой буфер и установит условие флага, когда оно будет выполнено. Затем пусть программа обработает буфер.

Ваше здоровье.

person UnanymousCoward    schedule 30.04.2015