DMC.45 · Телеметрия и служебное · ATmega328P
Задача
Принимать строки GPS по UART и определять наличие валидной позиции (по полю в GGA/RMC).
Алгоритм
UART-приём по символам в буфер до перевода строки; поиск '$GPRMC'/'$GPGGA' и проверка поля статуса/фикса.
Исходный код (C, avr-gcc)
#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
Пояснения
Полный парсинг координат требует разбора полей; здесь — детект валидного фикса как основа.