GPS NMEA parsen - mit Unit zum long oder "durch multiplizieren"?

Gast #1844054
Lesenswert?
• ▲
▼
Hallo Zusammen,

Parse gerade NMEA GPS Daten. Feine Sache bisher.

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

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
1
union long_union {
2
  int32_t dword;
3
  uint8_t  byte[7]; // ?
4
} longUnion;
5

6
int32_t join_bytes(uint8_t UBuffer[]) {   
7
  longUnion.byte[7] = *UBuffer;
8
  longUnion.byte[6] = *(UBuffer+1);
9
  longUnion.byte[5] = *(UBuffer+2);
10
  longUnion.byte[4] = *(UBuffer+3);
11
  longUnion.byte[3] = *(UBuffer+4);
12
  longUnion.byte[2] = *(UBuffer+5);
13
  longUnion.byte[1] = *(UBuffer+6);
14
  longUnion.byte[0] = *(UBuffer+7);
15
  return(longUnion.dword);
16
}

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

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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.