mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik GPS NMEA parsen - mit Unit zum long oder "durch multiplizieren"?


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

Parse gerade NMEA GPS Daten. Feine Sache bisher.

Bislang liegt z.B. ein extrahierter Breitegrad so vor.
Buffer - uint8_t
(
    [0] => 5
    [1] => 1
    [2] => 0
    [3] => 8
    [4] => .
    [5] => 9
    [6] => 8
    [7] => 3
    [8] => 2
)

ist dann der Breitengrad 5108.9832 NMEA (oder besser
51.089832 wie bei Google und co.)

Umrechnen muß ich bei 51.089832 den Nachkommaanteil
(0.089832 von Minuten in Sekunden, 0.089832/60 um
damit arbeiten zu können).

Gibt wohl zwei Wege, das in eine rechenbare Zahl zu bekommen.
Mit Union, nach diesem Muster
union long_union {
  int32_t dword;
  uint8_t  byte[7]; // ?
} longUnion;

int32_t join_bytes(uint8_t UBuffer[]) {   
  longUnion.byte[7] = *UBuffer;
  longUnion.byte[6] = *(UBuffer+1);
  longUnion.byte[5] = *(UBuffer+2);
  longUnion.byte[4] = *(UBuffer+3);
  longUnion.byte[3] = *(UBuffer+4);
  longUnion.byte[2] = *(UBuffer+5);
  longUnion.byte[1] = *(UBuffer+6);
  longUnion.byte[0] = *(UBuffer+7);
  return(longUnion.dword);
}

Oder glaub man kann auch das ganze
"durchmultiplizieren"
 
  Result = 0;
  Result = 10 * Result + Buffer[0] = 10 * 0 + 5 = 5
  Result = 10 * Result + Buffer[1] = 10 * 5 + 1 = 51
  Result = 10 * Result + Buffer[2] = 10 * 51 + 0 = 510
  //....


Die Kommastelle würde ich mir jeweils merken, und
dann später das ganz in ein float umrechen.
In diesem Fall (Komma bei 5) durch 10.000.
Und dann die Minuten in Sekunden umrechen...

Mach das zum ersten mal.
Was würdet Ihr machen?
Welche Lösung ist resourcen-schonender?

Ist ein STM32, aber der hat schon mächtig viel zu tun,
und da kommt noch einiges hinzu, das ganze geht on-the-fly,
ohne Puffer. Da würde das durchmultiplizieren eigentlich ganz
gut passen.
Mit Benchmarks kenne ich mich nicht aus....

Vielen Dank & Viele Grüße
Klaus

Autor: Klaus T. (gauchi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig verstehe, bekommst du eine Dezimalzahl als ASCII 
oder BCD String, da wirst du um das "durchmultiplizieren" nicht 
herumkommen.
Ein int32 besteht übrigens nur aus 4 Bytes.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank, ja, werde ich multiplizieren. passt prima zu on the fly
und läßt sich gut kontrollieren.

Viele Grüße
Klaus

Autor: Klaus T. (gauchi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn das ein ascii-string ist: gibt es bei dir kein atof oder ähnliches?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

verwende ggc, bei atof() meckert er leider.... hmmm
Naja, denke es geht aus so.

Vielen Dank
Klaus

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.