2016-03-23 25 views
1

私はArduinoにいくつかのセンサーが付いています。私はXbeeプロS1であるXbeeを使って1台のリモートPCにセンサーデータを送信しています。 Xbeeモジュールは、38400ボーレートで機能します。私はワイヤレスで送信するために合計15個のセンサーデータと2個の時間情報を持っています。私のセンサが移動中のプラットフォーム上に置かれているため、回転中にデータパケットが失われ、時間情報付きセンサデータの完全なセットを受信側で受信することができません。Arduino + Xbeeのために複数の文字列を連結します

Iがこの

URT*364.00*348.00*432.00*350.00*427.00*357.00*0.22*0.18*0.81*1.00*0.73*-0.37* 0.15*-0.06*-0.19*6.00*17324.00 
URT*364.00*348.00*432.00*349.00*428.00*357.00*0.22*0.18*0.81*1.00*0.73*-0.24* 0.16*-0.06*-0.19*8.00*2976.00 
URT*361.00*345.00*428.00*345.00*424.00*353.00*0.22*0.18*0.81*1.00*0.73*-0.24* 0.16*-0.06*-0.19*9.00*53812.00 
URT*363.00*347.00*430.00*349.00*427.00*356.00*0.23*0.18*0.81*1.00*0.61*-0.12* 0.15*-0.05*-0.19*11.00*39380.00 

ように見える次のコードテンプレート

Serial.write('U'); Serial.write('R'); Serial.write('T'); 
      Uint1.ival=rawX_ADXL337; 
      dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
      Serial.write("*"); 
      Serial.write(dtostrfbuffer); 
        Uint1.ival=rawY_ADXL337; 
        dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
        Serial.write("*"); 
        Serial.write(dtostrfbuffer); 
      Uint1.ival=rawZ_ADXL337; 
      dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
      Serial.write("*"); 
      Serial.write(dtostrfbuffer); 
        Uint1.ival=rawX_ADXL377; 
        dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
        Serial.write("*"); 
        Serial.write(dtostrfbuffer); 
      Uint1.ival=rawY_ADXL377; 
      dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
      Serial.write("*"); 
      Serial.write(dtostrfbuffer); 
        Uint1.ival=rawZ_ADXL377; 
        dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
        Serial.write("*"); 
        Serial.write(dtostrfbuffer); 
       //value after multiplication needed to be less than 2^15=32768 
             Uint1.ival=ax; 
             dtostrf(ax,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=ay; 
           dtostrf(ay,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=az; 
             dtostrf(az,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=gx; 
           dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=gy; 
             dtostrf(gy,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=gz; 
           dtostrf(gz,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=mx; 
             dtostrf(mx,5, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=my; 
           dtostrf(my,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=mz; 
             dtostrf(mz,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=wHighNow; 
           dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=wLowNow; 
             dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
             Serial.write("\n"); 
delay(100); 

を有するIは、文字列形式に変換した(静的チャーdtostrfbuffer [15];)と個別に送信します。私は以下のリファレンス(ArduinoStringConcat)を使用してすべての情報を含む単一の文字列を形成しようとしていますが、できません。

すべてのセンサーデータを1つのテレグラムにまとめて送信するにはどうしたらいいですか?私の例では、いくつかのデモの例やコードスニペットを提供してください。

Xbee Pro s1がこの最終的な大きな電報を送ることは可能でしょうか?

おかげ

+0

は「原因私のセンサーが回転中に、移動プラットフォーム上に配置されているという事実に、データ・パケットが失われている」、によるハードウェアに発生しています - あなたが示唆するように、センサーとデータ損失の間に必要な因果関係はありません。 – Olaf

+0

混乱して申し訳ありません。私は、センサーが高速で回転しているのを発見しました。私はすべてのパケット(すべての感覚の塊)を取得しません。したがって、いくつかのpacketlosが発生しているか、アンテナが回転角によっては機能していないと思われます。 –

+0

これはまだ変更されていないことを意味するものではありません(あなたのテキストが意味するものです)。とにかくあなたが何を求めているのかははっきりしない。私は、これがこのような質問をするのに最適な場所ではないかもしれないと考えています。電子機器のFAQをチェックしているのでしょうか? – Olaf

答えて

0

これは、文字列を連結し、全体の電報を送るのは良いアイデアではありません。

受信側では、受信したパケットと比較して、受信側でtimel関数を使用してpacketlosをチェックします(既に内部に時刻情報があるので)。送信しているすべてのセンサーデータが含まれている場合は、パケット長も確認する必要があります。

ことが可能である{合計長

を使用して、時間comaprision

//を使用して //}

idn = fscanf(DUT_port,'%s'); 
L = length(idn); 

A = sscanf(idn,'%*c%f%*c%f%*c%f%*c%f%*c%f',[1 inf]); 

checkpacketlossのXBeeのための完全な電報が、不要を送信するために!両方のアンテナがよく面に配向されていないと私は思う

、パケット損失は

0

単一のバッファへのデータのすべてを入れて、Serial.write()でそれを送信する必要はありません。関数への複数の呼び出しを行うと、XBeeモジュールのパケット化設定によってデータがいつ空中に送信されるかが決まります。 APIモードを使用している場合を除き、XBeeは特定の方法でデータをグループ化しているのではなく、リモートデバイスにストリームを送信すると考えてください。あなたは1つ以上のチャンクでデータを受け取るかもしれません、そして、あなたはそれを利用するために遠隔の端で一緒にそれをつなぎ合わせる必要があります。

そして、あなたはあなたの整数をフォーマットするSerial.print()を使用して浮くことができます。

Serial.print("URT*"); 
Serial.print(rawX_ADXL337); 
Serial.print('*'); 
Serial.print(rawY_ADXL337); 
Serial.print('*'); 
Serial.print(rawZ_ADXL337); 
Serial.print('*'); 
Serial.print(rawX_ADXL377); 
Serial.print('*'); 
Serial.print(rawY_ADXL377); 
Serial.print('*'); 
Serial.print(rawZ_ADXL377); 
Serial.print('*'); 
Serial.print(ax); 
Serial.print('*'); 
Serial.print(ay); 
Serial.print('*'); 
Serial.print(az); 
Serial.print('*'); 
Serial.print(gx); 
Serial.print('*'); 
Serial.print(gy); 
Serial.print('*'); 
Serial.print(gz); 
Serial.print('*'); 
Serial.print(mx); 
Serial.print('*'); 
Serial.print(my); 
Serial.print('*'); 
Serial.print(mz); 
Serial.print('*'); 
Serial.print(wHighNow); 
Serial.print('*'); 
Serial.print(wLowNow); 
Serial.print('\n'); 
+0

このメソッドは、浮動小数点数を直接(例えば3999.99)送ることもできますか?この理由のために、私は文字列として送信していました。受信側では、浮動小数点数に変換しています。 –

+0

それを試してみてください。 'Serial.print()'は浮動小数点形式です。 – tomlogic