www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik NMEA Datenframe auswerten


Autor: uC Noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: LordZiu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tim T. (tim_taylor)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier das NMEA mal aufm PC auseinanderzunehmen.

Autor: Michael M. (technikus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: uC Noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michael M. (technikus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.