2017-05-25 47 views
0

我能读取数据正常。数据是一系列记录,每个记录以“\ r \ n”作为终止符结尾,然后数据流以“\ r \ n”结尾。第一条记录完美,但其余记录缺少第一个X字符。 X也不会改变。数据来自调制解调器。我错过了这个例程以读取AVR上的uart数据

c = UART0_RxChar(); 
response[0]=c; 
i=0; 
rec=0; 
while((c=UART0_RxChar()) != CR) 
{ 
    response[i++]=c; 
    while ((c=UART0_RxChar()) != CR) 
    { 
     response[i++]=c; 

    } 
    rec++; 
    UART1_Printf("Record %d %s", rec, response); 
    UART1_Printf("\n\n"); 
    memset(response,0,strlen(response)); 
    i=0; 
    AT_ASSERT(UART0_RxChar() == LF) 
} 

AT_ASSERT(UART0_RxChar() == LF) 
// Finished 

坏数据接收

Record 1 7854122,4,2017-04-11 00:00,2017-04-11 8:09,29342441,,,,,,,0,0,0,0, 

Record 2 705-03 13:15,18958737,TRK 23564,,,,BOL 327867,,0,0,0,0, 

Record 3 7,BOL 327867,,0,0,0,0, 

Record 4 717-05-03 23:59,38580000,TRK 23564,,,,BOL 327867,,0,0,0,0, 

Record 5 7,BOL 327867,,0,0,0,0, 

Record 6 717-05-05 23:59,86340000,TRK 23564,,,,BOL 327867,,0,0,0,0, 

Record 7 7,BOL 327867,,0,0,0,0, 

实际数据

7854122,4,2017-04-11 00:00,2017-04-11 08:09,29342441,,,,,,,0,0,0,0, 
7854122,1,2017-04-11 08:09,,0,,,,,,,0,0,0,0, 
7854122,4,2017-05-03 08:00,2017-05-03 13:15,18958737,TRK 23564,,,,BOL 327867,,0,0,0,0, 
7854122,1,2017-05-03 13:15,2017-05-03 13:16,70332,TRK 23564,,,,BOL 327867,,0,0,0,0, 
7854122,3,2017-05-03 13:16,2017-05-03 23:59,38580000,TRK 23564,,,,BOL 327867,,0,0,0,0, 
7854122,3,2017-05-04 00:00,2017-05-04 23:59,86340000,TRK 23564,,,,BOL 327867,,0,0,0,0, 

回答

1

的UART可能无法读取数据速度不够快,捕捉这一切,并因此被丢弃的数据

如果UART_RxChar函数正在使用来自中断写入缓冲区的缓冲区,您可能可以加入重新确定缓冲区的大小。

+0

好吧,我认为这正是问题所在,但我从未在avr上设置过接收缓冲区。我正在研究。 – Eddie

0

您有一个错误导致缓冲区中的第一个字符保持第一次读取的内容,在本例中为'7'。

主要问题是printf()语句花费的时间太长,并且不允许UART0_RxChar()函数接收字符,因此它们只是被覆盖。

一个更好的方法可能是使用中断处理程序将输入的字符保存到缓冲区,然后在主循环中缓冲区满时打印出消息。您可能需要在两个缓冲区之间切换,以便在打印另一个缓冲区的内容时填写一个缓冲区。

中断处理程序将具有与您现在具有的类似逻辑:填充缓冲区直到\cr\lf,然后设置打印标志并切换到另一个缓冲区。在主循环中忙等待标志,并在设置时进行打印。

相关问题