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