У меня есть модуль 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 пожаров. Я проверяю переполнение, но этого не происходит. Очки отметить:
- УАПП ФИФО происходит также 16 байт
- Обновления на 1Гц и
021447
и т.д., временные метки, поэтому можно видеть, что каждый обновление будет полностью читать, с в между где-то теряется