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) ?
1 | float a; |
2 | double b; |
3 | a = 123.456; |
4 | b = a; |
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!
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.
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.
Ü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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.