2016-11-21 14 views
0

Я использую Pro Mini в качестве ведомого устройства I2C, которое вычисляет двойной. Этот двойной запрос запрашивается модулем WiFi ESP8266, и он отправляется по байтам I2C байтом.Отправка с двух сторон через I2C от Arduino Pro Mini до ESP8266

Теперь я пытаюсь собрать двойной на другом конце, но он не работает. Текущий код работает на ESP8266:

// 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 

Я узнал double на Arduino Pro Mini составляет 4 байта, но 8 байт на ESP8266. Могу ли я преобразовать это?

+2

Мое предположение, вы можете использовать 'float' с обеих сторон, так как ваш Arduino, очевидно, не обеспечивает двойную точность вообще. – user3528438

+0

Верно, но я использую библиотеки, которые возвращают 'doubles' почти в каждом методе. Но, видя, что '' '' '' '' '' '' '' '' '' 'одинаковые в Arduino, могу ли я просто изменить' union' на 'float'? Я попробую! Спасибо :) –

+3

Я бы предложил вам явно преобразовать его в 'float' в дополнение к изменению' union' на 'float', чтобы код не прерывался в будущем, если будет изменено определение' double'. – user3528438

ответ

0

ESP8266 является 32-битным процессором так sizeof(int) является 4 и sizeof(double) равно 8. На ATmega328 sizeof(int) является 2 и sizeof(double) равно 4. Однако на обоих процессорах sizeof(float) составляет 4, и именно поэтому вы можете использовать этот обходной путь вы упомянули в комментарии ,

Поскольку вы имеете дело с целыми числами, было бы лучше просто использовать int или uint32_t вместо double в коде ESP8266, с тем длина будет такой же, как Arduino-х double. Таким образом, вы можете избежать использования float, который генерирует довольно много байтов кода, который не нужен.

 Смежные вопросы

  • Нет связанных вопросов^_^