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


von Klaus (Gast)


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

von Klaus T. (gauchi)


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.

von Klaus (Gast)


Lesenswert?

Hallo,

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

Viele Grüße
Klaus

von Klaus T. (gauchi)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

Hallo,

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

Vielen Dank
Klaus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.