2016-11-21 13 views
0

私はPro MiniをI2Cスレーブとして使用しています。これはダブルを計算します。この2倍はESP8266 WiFiモジュールによって要求され、バイトごとにI2C経由で送信されます。Arduino Pro MiniからESP8266へのI2Cの二重送信

もう一方の端でダブルを再構成しようとしていますが、動作しません。 ESP8266上で実行されている 現在のコード:私はArduinoのプロミニにdoubleを発見

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

は4つのバイトが、ESP8266の8バイトです。これを変換できますか?

+2

私の推測では、あなたのArduinoは明らかに倍精度を提供していないので、両方の側で 'float'を使うことができます。 – user3528438

+0

真実ですが、ほとんどすべてのメソッドで 'double 'を返すライブラリを使用しています。しかし、「ダブル」と「フロート」とはArduinoで同じですが、私は 'union'を' float'メンバーに変更できますか?私はそれを試してみます!ありがとう:) –

+3

明示的に 'float'に変換して' union'を 'float'に変更することをお勧めします。そうすれば、' double'の定義が変更された場合に将来コードが破られることはありません。 – user3528438

答えて

0

ESP8266のでsizeof(int) 4とsizeof(double) 2及びsizeof(double)sizeof(float)が4両方のプロセッサに、しかし4であるATmega328 sizeof(int) 8.ある32ビット・プロセッサである、あなたがコメントに記載されている回避策を使用することができる理由であります。

あなたが整数を扱っているので、長さがアルドゥイーノのdoubleと同じになりますので、ちょうどESP8266のコードに代わりdoubleintまたはuint32_tを使う方が良いでしょう。そうすれば、フロートの使用を避けることができます。これにより、不要なコードがかなり数バイト生成されます。

関連する問題