2016-04-13 5 views
0

私はあるアルドゥイノから別のアルドゥーノに3つの浮動小数点値を送り、受け取ったアルドゥイノの配列にこれらの浮動小数点値を格納したいプロジェクトを行っています。受け取ったフロート値を印刷している間、私はシリアルモニタの最初の2桁しか見ることができません。あるアルドゥイノのフロート値を別のアルドゥーノに送ることはできません:

私は初心者であり、フロート値全体を取得する方法はわかりません。プログラムで私を助けてください。ここでは、送信機と受信機のコードを掲載しました。 トランスミッタのコード:事前に

float transmit[3]={72.453444,83.345678,60}; //Values to be sent 

void setup() 
{ 
Serial.begin(115200); 
int i; 
for(i=0;i<3;i++) 
{ 
Serial.write(transmit[i]); 
} 
} 
void loop() 
{ 
} 

Receiver’s Code: 
float received[3];  //create an float array 
int i; 
void setup() 
{ 
    Serial.begin(115200); 
} 
void loop() 
{ 
while(Serial.available()>0) 
{ 
    for(i=0;i<=2;i++) 
    { 
    received[i]=(Serial.read()); 
    delay(10); 
    } 
    Serial.println(received[0]); 
    Serial.println(received[1]); 
    Serial.println(received[2]); 
} 
} 
Values received on Serial Monitor: 
72 
83 
60 

感謝。

答えて

0

最初の2桁は表示されません。あなたはその整数部分を見ています。これは、Serial.Writeが整数値を受け入れるので、浮動小数点数がint(つまり切り捨てられた)に変換されて送信されるためです。

「そのまま」渡す場合は、まず値の配列をバイト配列にキャストしてから「生」に送信します。受け取ったときには、すべてのバイトを受け取らなければなりません。ここでは、コードは次のようになります。

送信者コード:

float transmit[3]={72.453444,83.345678,60}; //Values to be sent 

void setup() 
{ 
    Serial.begin(115200); 
    Serial.write((uint8_t*)transmit, 3 * sizeof(float)); 
} 
void loop() 
{ 
} 

Receiverのコード:

float received[3];  //create an float array 
int i; 
void setup() 
{ 
    Serial.begin(115200); 
} 
void loop() 
{ 
    if (Serial.available() >= 3 * sizeof(float)); 
    { 
     uint8_t *recv_bytes = (uint8_t*)transmit; 
     for(i=0; i < 3 * sizeof(float); i++) 
     { 
      recv_bytes[i] = Serial.read(); 
     } 
     Serial.println(received[0]); 
     Serial.println(received[1]); 
     Serial.println(received[2]); 
    } 
} 

注1:私はこれをテストしていないので、エラーが発生する可能性があり..試してみて、もしそれは動作しません、我々は再びそれを見てみましょう

注2:これは動作するはずですが、実際の生活には多くの問題があります。伝送中の停止点n-。ロバストなコミュニケーションのためには、バイトエスケープやビットボルのハンドシェーキングのようなものを追加することを検討してください。

注3:これは浮動小数点と同じendianness(例えば2つのarduinosの間)のシステムでのみ機能します。他のシステム(例えばPCやモバイルまたは知っている)とのインターフェースをするとエンディアンまたはフロート長さの不一致は、私はあなたの仕事のために

+0

おかげで使用される自動キャストを使用して通信を不可能にするので、あなたは、明示的に数値を変換する必要があります。..それでも送信プログラムと受信プログラムの両方でエラーが発生しました。プログラムを送信すると、「ハードウェアシリアル::書き込み(float [3]、unsigned int)」の呼び出しで一致する関数がありませんでした。 – Krish

+0

受信者のプログラムで、私は "初期化でfloatを 'uint8_t *'に変換できません"というエラーを受けました。 – Krish

+0

@Krish [OK]を、暗黙のキャストが好きではないかもしれません。私を助けるかもしれない。このコード – frarugi87

関連する問題