0

LPC1769 に GPS モジュールを接続しています。私のソフトウェアがそれらを読み取ると、次のように混乱することがよくあります。

[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その他はタイムスタンプであるため、他のすべての更新が完全に読み取られ、その間の更新がどこかで失われていることがわかります。
4

1 に答える 1

0

受信バッファが空のときにのみオーバーフローをチェックしているようです。RBR レジスタを読み取る前に、cicle の後でオーバーフローをチェックしてみてください。

于 2014-01-21T18:27:42.337 に答える