Float nach double konvertieren um es über I2C zu senden

Gast #4632132
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) ?
#4632156
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!
Gast #4632158
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.
Gast #4632160
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.
Gast #4632230
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren