Hallo zusammen, versuche gerade verzweifelt GPS Daten gescheit zu parsen mit einem ATmega644P in C. Über Uart0 kommen die NMEA Daten mit 4800 BAUD rein. Über UART1 sollen erst einmal nur Debugmeldungen ausgegeben werden, später auch aufbereitete Daten. Sobald die Daten aufbereitet sind, soll auch eine LCD Ausgabe erfolgen. Im ersten Schritt versuche ich "nur" zu erkennen, welcher Datensatz gerade vom GPS Empfänger kommt. Sobald dieser erkannt wurde, soll es eine Ausgabe über UART1 geben. Doch diese Ausgabe funktioniert nicht :( Vielleicht kann sich jemand mal den angehängten Code anschauen und mir sagen, was ich falsch mache. Ich habe testweise folgendes bei Zeile 187 eingebaut, um zu prüfen ob der Stream prinzipiell 1:1 über UART1 ausgegeben werden kann: uart1_putc( (unsigned char)gpsstring[i] ); Das funktioniert auch. Also Hardwaretechnisch müsste also alles in Ordnung sein. Hier ein paar Demo Daten: $GPRMC,234743.000,A,6666.6666,N,7777.7777,E,0.00,125.11,030614,,,A*66 $GPGGA,234744.000,6666.6666,N,7777.7777,E,1,09,1.0,103.1,M,47.9,M,,0000* 54 Der Empfänger spuckt auch noch weitere Daten aus, welche mich aber im Moment nicht interessieren. Danke schon mal vorab.
:
Bearbeitet durch User
Achja, habe vergessen zu erwähnen, dass Ich ein Quarz mit 18,432MHZ einsetze. Habe dies auch mit dem Oszi überprüft. (GND -> XTAL1).
Bau mal einen Timer rein der jede Sekunde einen I/O-Pin toggelt damit du siehst ob dein AVR noch läuft.
@Frank S, ist zwar etwas komisch programmiert aber egal du darfst deine Laufvariable [i] nicht in einer FOR hochzählen, sondern nur, wenn ein gültiges zeichen empfangen wurde die meiste zeit deiner Schleife wird er "UART_NO_DATA" empfangen (weil die UART relativ zur CPU gesehen langsam ist) also verlässt er die FOR Schleife noch bevor die ersten 6 Zeichen empfangen wurden ich würde das generell aber anders programmieren 1. eine Do While für den Empfang von einem kompletten String (bis Stringendekennung, vermutlich : 0x0D, 0x0A) 2. den String auswerten per
1 | if(strncmp(nmea_str,"$GPGGA",6)==0) { |
2 | |
3 | }
|
Gruss Uwe
:
Bearbeitet durch User
Guggsu hier. Musst nurnoch die uart_getc der Peter Fleury lib einbauen. Und in der uart_align das auskommentierte einkommentieren.
Ein Protokol arbeitet man mit einer Zustandsmaschine ab.
Danke für die Antworten und ein besonderes Danke an Martin. Ich habe nun Martins Code genutzt und angepasst. Funktioniert einwandfrei. Falls Bedarf besteht, kann ich den fertigen Code hier nochmal komplett anhängen. Gruß Frank
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.