Forum: Mikrocontroller und Digitale Elektronik NMEA Datenframe auswerten


von uC Noob (Gast)


Lesenswert?

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

von LordZiu (Gast)


Lesenswert?

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.

von Tim T. (tim_taylor) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

Probier das NMEA mal aufm PC auseinanderzunehmen.

von Michael M. (technikus)


Lesenswert?

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

von uC Noob (Gast)


Lesenswert?

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...

von Michael M. (technikus)


Lesenswert?

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

von Volker S. (volkerschulz)


Lesenswert?

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
Noch kein Account? Hier anmelden.