【问题标题】:Stopping the program when reading data from UART从 UART 读取数据时停止程序
【发布时间】:2015-04-29 12:19:14
【问题描述】:

我有这个简单的代码:

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);
}

知道程序停止的原因吗?

【问题讨论】:

  • 因为!(in &amp; UART_NO_DATA) || (in &amp; UART_BUFFER_OVERFLOW)在你遇到的情况下始终为真。 尝试过什么?
  • 我想检查数据是否可用。抱歉,这是 goog 条件:while((in & UART_NO_DATA) || (in & UART_BUFFER_OVERFLOW));
  • 你对你的问题做了什么尝试?您是否尝试过使用调试器?你有没有尝试过?
  • 不幸的是。我没有自己的调试器。 :(
  • 没有调试器的程序员有点像没有车的出租车司机......如果你没有调试器,你怎么期望完成任何工作?

标签: c avr uart


【解决方案1】:

即使您当前的方法有效,您也容易丢失 UART 数据。你真的应该使用中断而不是轮询。让中断填充足够大的缓冲区并在完成时设置标志条件。然后,让程序处理缓冲区。

干杯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多