Ich hab den Code irgendwo im Internet gefunden und angepasst. Es wird einmal auf ein "$" gewartet, erst wenn das empfangen wird, wird der Header und dann die einzelnen Daten ausgelesen. Dabei wird im Getgps immer bis zu einem bestimmten Symbol ein String zusammengebaut, zB sind die meisten Daten zwischen "," zu finden. Teilweise Suche ich mir auch nur die Vor- oder Nachkommastellen raus weil ich den Rest nicht brauche.
Hier ein Auszug aus meinem Programm:
( GPS() muss regelmäßig, bzw wenn etwas im USART Buffer ist, aufgerufen werden)
Code:
/*************************
#define maxline 40
char line[maxline]; // global
GPS++++++++++++++++++++++++++++++++++++++*/
static inline void GPS()
{
char x_gps;
x_gps=0;
x_gps=USART_Receive();
if (x_gps=='$')
{
Getgps(','); //Hole den Header
if(strcmp(line,"GPGGA")==0) Gps_gga();
if(strcmp(line,"GPZDA")==0) Gps_zda();
}
}
/***************Position/Wert vom GPS***********************/
unsigned char Getgps(unsigned char end)
{
unsigned char c,i;
char komma, stern;
komma = ',';
stern = '*';
line[0]=0;
i=0;
c=0;
do
{
c=USART_Receive();
if(c==stern) return 0; //Checksumme erreicht
if(c==komma) return i; //Ende eines Wertes erreicht
if(c!=end) //Buchstaben sammeln
{
line[i]=(char)c;
i++;if (i>=maxline-1) {line[0]=0;}
line[i]=0; //End of String updaten
}
}while(c!=end);
return i;
}
void Gps_gga() //$GPGGA Meldung -----------------------------------------
{
char num, hdop,empfang;
char komma,stn, min;
short x,y;
char buffer[10];
short temp;
komma = ',';
x=0;y=0;
satcount=0; //Anzahl benutzter Satelliten
num=0;
// Uhrzeit
Getgps('.'); strcpy(zeit,line); zeit[4]=0;// Sekunden raus
Getgps(komma); //Rest
//Breitengrad
Getgps('.'); // Grad und Minuten werden nicht gebraucht
num=Getgps(komma); //Nachkommastellen
if(num!=0) {line[4]=0;y=atoi(line);} // nur die ersten 4 Stellen
Getgps(komma); // N/S ignorieren
//Längengrad
Getgps('.'); // Grad und Minuten werden nicht gebraucht
num=Getgps(komma); //Nachkommastellen
if(num!=0) {line[4]=0;x=atoi(line);}
Getgps(komma); // O/W ignorieren
// //0=kein Empfang, 1=GPS, 2=DGPS
num=Getgps(komma);
//Anzahl benutzter Satelliten
num=Getgps(komma);
if(num!=0) { satcount=(unsigned char)atoi(line);}
//HDOP Horizontal Dilution of Position
// Getgps(',');
hdop=9;
Getgps('.');
hdop=(char)atoi(line);
}
LG!
Lesezeichen