Hey Leute, ich beschäftige mich seit kurzem mit der Programmierung von uCs. Ich hab mir vor kurzem einen GPS Empfänger ersteigert und möchte nun die Daten auswerten. Dazu hab ich allerdings eine par Fragen... Momentan kann ich bereits einen ganzen Datenframe über die UART Schnittstelle am uC empfangen. Jedoch weiß ich nicht wie ich dabei am besten vorgehen soll... Mein Problem ist folgendes: Ich habe nun alle Daten in einem großen Array stehen. Um die Daten jetzt aber auswerten zu können muss ich sie ja aus dem großen Array herauslösen.... Wie geh ich dabei am besten vor? Ist es sinnvoll eine Struktur anzulegen und dann den Array den verschiedenen Strukturelementen zuordnen? Oder wäre es besser das ganze mit einem ENUM zu machen? Oder gehe ich bei sowas ganz anders vor? bin für eure Ratschläge sehr dankbar... Gruß uC Noob
Nimm je ein Struct, dass je eine NMEA-Message abbildet. Sprich: Für jedes Datenelement in der Message gibt es einen passenden Struct-Member. Dann frickelst du die NMEA-Messages auseinander und speicherst sie in die gewünschten struct-member.
Du bastelst dir einfach einen Buffer für das was über den Com-Port kommt, den du dann Zeilenweise (CR,LF) ausliest und in eine entsprechendes Struct parst. Hab dir dazu mal das NMEA2.1 Protokoll angehängt.
Wie Tim Taylor richtig schreibt: Erstmal in einen Empfangspuffer lesen, bis CR LF gefunden wurde. Dann prüfen, ob der Datensatz komplett ist, also $GP suchen oder bei proprietären Datensätzen &PX. Anschließend den gültigen String weiterverarbeiten. Du willst ja wohl bestimmte Informationen haben, z.B. Position, Uhrzeit, Routenwegpunkt, etc.. Such Dir aus der NMEA-Spezifikation den passenden Datensatz aus und suche nach dem Kenner, z.B. GLL, RMC oder WPL. Den kannst Du z.B. mit strstr (ich denke Du arbeitest mit C) bequem finden. Wenn der zurückgelieferte Zeiger nicht NULL ist, hast Du den passenden Datensatz. Jetzt kannst Du ihn sequentiell mit atoi oder strtol in numerische Werte wandeln, wobei strtol den Vorteil hat, die letzte gelesene Position im String zurückzugeben. Damit kann man sich also bequem durch den String hangeln. Ob Du die numerischen Werte in ein Array, eine Struktur oder einzelne Variablen packst, hängt von der weiteren Verarbeitung ab. Servus Michael
Hey ihr, vielen Dank erstmal für die Antworten, hat mir geholfen. Ich habe nun eine Struktur angelegt, in die ich meine empfangenen Daten kopieren möchte. Ich bin jetzt noch auf ein weiteres Problem gestoßen. In meinem empfangenen Datenframe stehen ja alle verschiedenen Daten drin, diese sind jeweils durch ein Komma getrennt. Das heisst ich muss meinen Datenframe nach Kommas durchsuchen und dann die jeweiligen Teile zwischen zwei Kommas rauskopieren. In der Theorie ist mir das klar, aber wie setzte ich das in der Praxis um? Und was für Datentypen deklariere ich in meiner Struktur? Ich kann da ja keine Felder deklarieren, weil ich ja gar nich weiß wie groß diese sein müssen. Ich wäre euch für Ratschläge sehr dankbar...
Leider sind zu viele Fragen offen, um hier wirklich sinnvolle Tipps zu geben. Was soll mit den NMEA-Daten passieren? Wird in C gearbeitet (anzunehmen, aber nie wirklich gesagt)? Welcher µC kommt zum Einsatz (wieviel Speicher hat man, ist floating point drin)? Trotzdem: Ich sehe wenig Sinn, die einzelnen Bestandteile des NMEA-Strings wieder als String im µC abzulegen. Geht natürlich, aber was bringts? Man braucht mehr Platz als die numerische Variante und kann damit auch nicht rechnen. > Und was für Datentypen deklariere ich in meiner Struktur? Ich kann da ja > keine Felder deklarieren, weil ich ja gar nich weiß wie groß diese sein > müssen. Wenn es wirklich Strings sein müssen: Maximal mögliche Länge des Datensatzes vorsehen. Ich würde nicht die Datenstruktur aller NMEA-Datensätze sklavisch im µC nachbilden, sondern mir überlegen, was ich für meine Anwendung brauche. Danach dann die Datenstruktur auslegen, z.B. struct { long latitude; // Fixkomma, von mir aus auch float long longitude; // Fixkomma, von mir aus auch float long utc; char status; } nmea_data; Wie man die Daten reinbekommt (strtol) habe ich ja schon geschrieben. Servus Michael
Es sei noch erwaehnt dass es eigentlich ueberhaupt keines Empfangspuffers bedarf. Die Wiederhol- und Bitraten bei NMEA sind so gering, dass man das locker "on-the-fly" verarbeiten kann. Und ganz nebenbei waere es auch noch sinnvoll, das 8-Bit-XOR zu checken (denn dafuer sind Checksummen ja da). ;) Volker
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.