Hallo, könntet Ihr mir mal als Anfänger die Richtung weisen? Ich weiss, was ich machen will, finde aber den Ansatz nicht so richtig. Ich möchte GPS Daten im NMEA-0183 Format über die UART einlesen. Nach Standard beginnt der Datenblock mit "$", dann kommen Gerätename und Sequenzcode z.B. $GPGGA , dann die einzelnen Daten mit Komma getrennt. OK! Also einzelnes Zeichen aus dem Lesepuffer holen und mit dem jeweiligen gewünschten vergleichen. Ist "$GPGGA" gekommen kann ich mit dem Ablegen der Daten anfangen. Das dachte ich könnte mit einer Structur funktionieren. Mein Problem: Die Datenfelder können unterschiedliche Länge haben, z.B. auch mal leer sein. Also wie kommen nun die einzelnen ASCII Zeichen an die richtige Stelle in der Structur? Gesendet werden sie ja von links nach rechts. Hab ich mich irgenwie verständlich ausgedrückt, wo mein Problem liegt? Mir würde sehr helfen, wenn Ihr mir einen Lösungsansatz zeigen könntet, dann kann ich mal los programmieren. Schon mal Danke! Gruss Holger Ach ja: Die ASCII Zeichen sollen an ein Display gesendet werden, erst später will ich dann vielleicht mit rechnen und muss sie dann umwandeln.
Hi wenn du nicht gerade den kleinsten AVR (also irgend einen mit SRAM) hast: Definier dir doch einen Puffer den du immer wenn ein '$' kommt beginnst zu füllen. Ist das Telegramm beendet pfriemelst du den Inhalt des Puffers auseinander. Matthias
Also auf gut Deutsch eine Zustandsmaschine: Auf Startzeichen warten ($) und dann die nächsten Zeichen vergleichen, ansonsten das oder die gelesenen Zeichen verwerfen. Am besten im Interrupt, dabei den Zustand über Flags festhalten.
state machine halte ich für den Anfang für reichlich übertrieben. Matthias Vorschlag ging wohl eher davon aus, die Daten telegrammweise in einen Puffer zu legen und die Verarbeitung danach ,,am Stück'' durchzuführen. Für diese Verarbeitung kann man verschiedenste Methoden benutzen. Wenn genügend ROM (und RAM) da ist, kann man sscanf() nehmen. Andernfalls mit strtok() den String auseinanderfusseln und die Teile mit atoi() in Zahlen wandeln.
Ich glaube, Du suchst eine Grundidee als "start up". In Deinem Fall ist das "auseinanderpfriemeln" der Daten ja relativ einfach: Das $-Zeichen ist ja für dich immer der Start, und die Kommazeichen läuten jeweils einen neuen Datenabschnitt ein. Wenn Du also ein 2-dimensionales array anlegst: unsigned char Daten[Max_Zahlenlaenge][Zahlen_pro_Telgramm]; würde deine Programmschleife etwa so aussehen können: for(;;) // forever { temp = GetChar(); // oder wie die Empfangsroutine heisst ... if (temp == '$') { i=0; // Zurück an den Anfang des Arrays j=0; // } else { if (temp == ',') { i=0; // nach einem Komma fängt die nächste Zahl an j++; // } else { Daten[i][j]=temp // weder '$' noch ',', dann als Daten // eintragen } } Hier fehlen natürlich alle möglichen Abfragen gegen überlauf, Plausibilitätsprüfungen, timeouts, das löschen alter Daten vom vorigen Zyklus etc .... frohes Schaffen ! Gruß Jens
Danke! Das hilft mir weiter, so werd ichs mal probieren. Genau so ein Anfang hat mir gefehlt. Gruss Holger
Hallo, auf Holgi's Elektronikseite gibt's nen Source, der genau das macht was du willst - kannst dir ja mal anschaun ;) http://home.t-online.de/home/holger.Klabunde/avr/avrboard.htm#GPSdisplay mfG aleX
Da sieht man mal wozu Holgis gut sind! grins und freu Muss ich das Rad nich nochmal erfinden! Danke! Holger
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.