Forum: Mikrocontroller und Digitale Elektronik Float nach double konvertieren um es über I2C zu senden


von Peter (Gast)


Lesenswert?

Hallo,

Ich lese mit meinem Arduino Zero ein GPS Modul aus. Von diesem bekomme 
ich über die Serielle Schnittstelle in form des NMEA Protokolls unter 
anderem meine Koordinaten. Nun möchte ich jedoch diese Koordinaten per 
I2C übertragen.

Nun ist die Frage, in welchem Format ich sie Übertrage. Momentan liegen 
sie als Float in der Form 12309.57 vor. Wie überträgt man diese Daten 
nun am besten über I2C?

Eigentlich dachte ich daran dieses Float in ein double umzuwandeln und 
dann zu senden. Auf der Gegenseite könnte dieser Wert dann (falls nötig) 
wieder in ein Float umgewandelt werden. Das ganze soll simpel und 
universell sein, wollte daher ohne sonderfirmen wie einem union 
auskommen (wenn es denn geht).

Wie Wandel ich denn am besten den float in ein double um?

double = (double)(floatVal*1000) ?

von Jemand (Gast)


Lesenswert?

1
float a;
2
double b;
3
a = 123.456;
4
b = a;

von Mathias B. (mbr)


Lesenswert?

Hallo,

float und double sind je nach compiler intern dasselbe.
Aber anstelle eines floats oder doubles zu übertragen kannst Du auch 
einfach ein Int übertragen, multipliziere doch einfach die Koordinate 
mit z.B. 100 (2 Nachkommastellen) und übertrage dann 1230957, die 
Gegenstelle muss dann einfach den Wert durch 100 dividieren, fertig!

von Wolfgang (Gast)


Lesenswert?

Peter schrieb:
> Nun ist die Frage, in welchem Format ich sie Übertrage. Momentan liegen
> sie als Float in der Form 12309.57 vor.

Wenn du irgendwelche Anspüche an die Genauigkeit der Koordinaten hast, 
solltest du nochmal überlegen, ob float wirklich der passende 
Variablentyp ist, um die per NMEA-Sentence empfangenen Daten zu 
transportieren.

Du könntest die Zahlen BCD-Kodiert über I2C transportieren. Das ist 
ziemlich kompakt und wäre ohne Verlust der Auflösung möglich.

von PittyJ (Gast)


Lesenswert?

Und warum als Double?
Wenn das als Float vorliegt, dann bringt eine Umwandlung auf Double 
überhaupt nichts, weil ja keine Information dazu kommt.
Da könnte man auch gleich einen Float übertragen.

Und Floats würde ich nicht binär übertragen. Dazu muss sichergestellt 
sein, dass Byte-Order und Float-Format (z.B. IEEE-754) auf beiden Seite 
gleich sind.

von Fritz G. (fritzg)


Lesenswert?

Übertrage sie so wie sie sind: als Text. Dann verlierst du keine 
Genauigkeit. Bei avr-gcc ist double gleich float, damit verlierst du ein 
paar Stellen. Wenn die Gegenstelle kein AVR ist, kann sie den Text dann 
wahrscheinlich korrekt in Double umwandeln.

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Peter schrieb:
> Das ganze soll simpel und
> universell sein,

Dann als Text.
Anders kommt das ja auch nicht vom Modul.
Sonst musst du dich wieder mit dem internen Fließkommaformat rumärgern.

von MaWin (Gast)


Lesenswert?

Peter schrieb:
> Momentan liegen sie als Float in der Form 12309.57 vor.

Das its zunächst mal kein float, sondern eine Ziffernfolge.

> Wie überträgt man diese Daten
> nun am besten über I2C?

Wahrscheinlich meinst du was anderes:

Du bekommst die Daten in einer ASCII-Ziffernfolge vom NMEA Gerät
und willst es in einer Binärzahl aussenden.

Die Funktion atof wandelt die Ziffernfolge in eine Binärzahl,
zunächst mal als double aber auf dem Arduino ist double dasselbe wie 
float, also nur 32 bit gross.

Reicht die Zahl ? NEMA hat 9 signifikante Stellen, davon 4 nach dem 
Komma und 5 davor wobei es davor nur bis 36000 geht. 32 bit float hat 23 
Mantissenbits, also bis 838.8608 .

Klar Antwort: Der float eines Arduino reicht nicht um eine NMEA Position 
zu übermitteln, es würde Genauigkeit verloren gehen.

Ein 64 bit double würde reichen, aber dafür gibt es im Arduino keine 
Standardfunktionen. Eine unsigned int 32 bit wärde reichen, wenn man 
beim Einlesen der Ziffernfolge das Komma einfach weglässt. Daher würde 
ich den Wert als vorzeichenlose 32 bit Zahl übertragen. Der Empfänger 
kann ja wieder /1000 rechnen, was Unsinn ist da die Zahl sowieso 
Bogensekunden darstellt, also in eine Winkelangabe (mit ' und .) 
umgeformt werden sollte.

von Dirk B. (dirkb2)


Lesenswert?

MaWin schrieb:
> Reicht die Zahl ? NEMA hat 9 signifikante Stellen, davon 4 nach dem
> Komma und 5

Das sind mit Komma 10 Zeichen. Gegenüber 8 Byte vom double ist da keine 
große Ersparniss.

Bei einem 32-Bit Wert schon.

Aber lohnt sich das?
Wie oft kommen die Daten?

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.