2016-11-21 4 views
0

Ich benutze einen Pro Mini als I2C-Slave, der ein Doppel berechnet. Diese Doppelanforderung wird vom ESP8266-WiFi-Modul angefordert und über I2C byteweise gesendet.Senden Doppel über I2C von Arduino Pro Mini zu ESP8266

Jetzt versuche ich das Doppel am anderen Ende wieder zusammenzusetzen, aber es funktioniert nicht. Aktuelle Code auf Esp8266 läuft:

// ABOVE SETUP 
union { 
    byte bytes[4]; 
    double value; 
} bytedouble; 

// IN LOOP 
while(Wire.available()){ 
    byte read = Wire.read(); 
    bytedouble.bytes[num] = read; 
    num++; 
} 
Serial.println(bytedouble.value); // Returns ovf/overflow 

ich ein double auf dem Arduino Pro Mini fand heraus, ist 4 Bytes, aber 8 Bytes auf dem Esp8266. Kann ich das konvertieren?

+2

meine Vermutung ist, können Sie 'float' auf beiden Seiten verwenden, da Ihr Arduino offensichtlich keine doppelte Genauigkeit bietet. – user3528438

+0

Stimmt, aber ich benutze Bibliotheken, die in fast jeder Methode "doubles" zurückgeben. Aber da "double" und "float" in Arduino gleich sind, kann ich einfach die "union" in ein "float" -Member ändern? Ich werde es versuchen! Danke :) –

+3

Ich würde vorschlagen, dass Sie es explizit zu einem 'float' konvertieren, um die' union' in 'float' zu ändern, so dass der Code in der Zukunft nicht bricht, falls sich die Definition von' double' ändert. – user3528438

Antwort

0

Esp8266 32-Bit-Prozessor so ist sizeof(int) 4 und sizeof(double) ist 8. Auf ATmega328 sizeof(int) 2 und sizeof(double) ist 4. jedoch auf beiden Prozessoren sizeof(float) 4 ist, und das ist, warum Sie diese Abhilfe verwenden könnten Sie im Kommentar erwähnt .

Da Sie mit Integer-Zahlen handelt es besser wäre, nur int oder uint32_t zu verwenden, anstatt double in Esp8266 den Code, so dass die Länge double die gleiche wie Arduino sein wird. Auf diese Weise können Sie die Verwendung von Floats vermeiden, die einige unnötige Byte Code generieren.

Verwandte Themen