AFON // радиотехник affonya@mail.ru
← Все проекты для дронов

Разбор NMEA от GPS

Приём строк NMEA по UART и выделение признака валидного фикса.

DMC.45 · Телеметрия и служебное · ATmega328P

Задача

Принимать строки GPS по UART и определять наличие валидной позиции (по полю в GGA/RMC).

Алгоритм

UART-приём по символам в буфер до перевода строки; поиск '$GPRMC'/'$GPGGA' и проверка поля статуса/фикса.

Исходный код (C, avr-gcc)

⇩ Скачать 45-gps-nmea-parse.c

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <avr/io.h>
#include <string.h>
static void uart_init(uint32_t baud){
  uint16_t ubrr=(F_CPU/(16UL*baud))-1;
  UBRR0H=ubrr>>8; UBRR0L=ubrr;
  UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);
  UCSR0B=(1<<RXEN0);
}
static uint8_t rx(void){ while(!(UCSR0A&(1<<RXC0))); return UDR0; }
int main(void){
  char line[80]; uint8_t i=0;
  uart_init(9600); DDRB|=(1<<PB5);
  for(;;){
    char c=rx();
    if(c=='\n'||i>=79){ line[i]=0; i=0;
      if(strncmp(line,"$GPRMC",6)==0 && strstr(line,",A,")) PORTB|=(1<<PB5); // фикс валиден
      else if(strstr(line,",V,")) PORTB&=~(1<<PB5);
    } else if(c!='\r') line[i++]=c;
  }
}

Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf

Пояснения

Полный парсинг координат требует разбора полей; здесь — детект валидного фикса как основа.

Смотрите также

Как работает GPS/ГНСС