Gps LPC1769 UART读取出错

Gps LPC1769 UART读取出错,gps,uart,lpc,Gps,Uart,Lpc,我有一个GPS模块连接到LPC1769。当我的软件读取它们时,它们经常会像这样乱七八糟: [gps] Parsing: GPGGA,021447.80$GPGGA,021448.800,,,,,0,0,,,M,,M,,*4B [gps] Parsing: GPGSA,A,1,,,,,,,,,,,,,,,*1E [gps] Parsing: GPGSV,1,1,00*79 [gps] Parsing: GPRMC,021448.800,V,,,,,0.00,0.00,060180,,,N*41 [

我有一个GPS模块连接到LPC1769。当我的软件读取它们时,它们经常会像这样乱七八糟:

[gps] Parsing: GPGGA,021447.80$GPGGA,021448.800,,,,,0,0,,,M,,M,,*4B
[gps] Parsing: GPGSA,A,1,,,,,,,,,,,,,,,*1E
[gps] Parsing: GPGSV,1,1,00*79
[gps] Parsing: GPRMC,021448.800,V,,,,,0.00,0.00,060180,,,N*41
[gps] Parsing: GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
[gps] GPS location: 231200246:21448, no fix
[gps] Parsing: GPGGA,021449.80$GPGGA,021450.800,,,,,0,0,,,M,,M,,*42
[gps] Parsing: GPGSA,A,1,,,,,,,,,,,,,,,*1E
[gps] Parsing: GPRMC,021450.800,V,,,,,0.00,0.00,060180,,,N*48
[gps] Parsing: GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
[gps] GPS location: 45200246:21450, no fix
[gps] Parsing: GPGGA,021451.80$GPGGA,021452.800,,,,,0,0,,,M,,M,,*40
[gps] Parsing: GPGSA,A,1,,,,,,,,,,,,,,,*1E
[gps] Parsing: GPRMC,021452.800,V,,,,,0.00,0.00,060180,,,N*4A
[gps] Parsing: GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
[gps] GPS location: 135200246:21452, no fix
每个批处理的第一句话以16个字节开始(总是16个字节;我的代码在解析之前会吞下最初的$)。我的代码如下所示:

[gps] Parsing: GPGGA,021447.80$GPGGA,021448.800,,,,,0,0,,,M,,M,,*4B
[gps] Parsing: GPGSA,A,1,,,,,,,,,,,,,,,*1E
[gps] Parsing: GPGSV,1,1,00*79
[gps] Parsing: GPRMC,021448.800,V,,,,,0.00,0.00,060180,,,N*41
[gps] Parsing: GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
[gps] GPS location: 231200246:21448, no fix
[gps] Parsing: GPGGA,021449.80$GPGGA,021450.800,,,,,0,0,,,M,,M,,*42
[gps] Parsing: GPGSA,A,1,,,,,,,,,,,,,,,*1E
[gps] Parsing: GPRMC,021450.800,V,,,,,0.00,0.00,060180,,,N*48
[gps] Parsing: GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
[gps] GPS location: 45200246:21450, no fix
[gps] Parsing: GPGGA,021451.80$GPGGA,021452.800,,,,,0,0,,,M,,M,,*40
[gps] Parsing: GPGSA,A,1,,,,,,,,,,,,,,,*1E
[gps] Parsing: GPRMC,021452.800,V,,,,,0.00,0.00,060180,,,N*4A
[gps] Parsing: GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
[gps] GPS location: 135200246:21452, no fix
void gps\u任务(void){
字符缓冲区[128],*ptr;
邮包地址;
对于(;;){
而(Uart_ReadChar(3)!=“$”);
ptr=缓冲区;
而((*ptr++=Uart_ReadChar(3))!='\n');
*(ptr-1)=0;
日志调试(“解析:%s”,缓冲区);
//解析缓冲区
Zeptos_睡眠(1000);
}
}
如果我取消睡眠,问题只会在第一次更新时发生,然后所有其他的都会正常阅读。以下是ReadChar代码:

char-Uart\u-ReadChar(int-uartn){
LPC_UART_TypeDef*UART=uarts[uartn];
uint32_t状态;
而((状态=uart->LSR)&1)==0){
if(状态和(1 RBR和0xff;
}
当相应的UART IRQ触发时,
BlockOnIrq
调用there返回。我检查是否存在溢出,但没有发生。需要注意的要点:

  • UART FIFO恰好也是16字节
  • 更新频率为1Hz,
    021447
    etc是时间戳,因此可以看到其他所有更新都在被完全读取,中间的更新在某处丢失

似乎只有在接收缓冲区为空时才检查溢出。 在读取RBR寄存器之前,尝试检查循环后的溢出