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

Gast #1844054
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.