2014-01-17 57 views
0

我有一個GPS模塊連接到LPC1769。當我的軟件讀取他們,他們經常得到搞砸這樣的:LPC1769 UART讀取混合

[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,我的代碼燕子初始$解析之前)。我的代碼如下所示:

void gps_task(void) { 
    char buffer[128], *ptr; 

    locupd_packet_t loc; 

    for (;;) { 
     while (Uart_ReadChar(3) != '$'); 
     ptr = buffer; 
     while ((*ptr++ = Uart_ReadChar(3)) != '\n'); 
     *(ptr - 1) = 0; 

     Log_Debug("Parsing: %s", buffer); 
     // Parse buffer 
     Zeptos_Sleep(1000); 
    } 
} 

如果我刪除睡眠,問題只發生在第一次更新,然後所有其他讀取正常。這裏的ReadChar代碼:

char Uart_ReadChar(int uartn) { 
    LPC_UART_TypeDef *uart = uarts[uartn]; 

    uint32_t status; 
    while (((status = uart->LSR) & 1) == 0) { 
     if (status & (1 << 1)) Log_Error("RX buffer overflow on UART %i", uartn); 
     Zeptos_BlockOnIrq(UART0_IRQn + uartn); 
    } 

    return uart->RBR & 0xff; 
} 

BlockOnIrq調用有返回相應的UART IRQ火災時。我檢查溢出,但它不會發生。注意事項:

  • 的UART FIFO恰好也是16個字節
  • 的更新以1Hz的頻率和021447等都是時間戳,因此可以看到所有其他更新是充分閱讀,與在中間一些丟失的地方

回答

0

看起來你只檢查接收緩衝區爲空時溢出。 嘗試在讀取RBR寄存器之前檢查Cicle之後的溢出。