4

単純な2ノードのXbeeネットワークを介してフロートを送信するのに問題があります。

Xbeeシステムがパッケージをバイト経由で送信することを知っているので、charを送信できますが、それ以上のものを送信するのに問題があり、どこにもドキュメントが見つからないようです。

これが私の現在の(基本的な)コードです。

送信者:

(... appropriate setup...)
void loop()
{
  sensorValue = analogRead(analogInPin);
  sensorValueTemp = sensorValue / 9.31; //LM35 measurement into Centigrade
  Serial.print(sensorValueTemp);
  delay(1000);
}

受信者:

(...appropriate setup...)
void loop() { 
  lcd.setCursor(0, 0);
    if (Serial.available() > 0) {
    lcd.print(incomingByte);
  }
  delay(1000);
}

フロートを正常に送信するためのヒントはありますか?または、すでに正しく送信されている場合、正しく読み取る方法は?

ありがとう

4

3 に答える 3

3

floatバイト単位で送信floatし、受信者で再構築できます。

次の例が役立つ場合があります。

送信者側:

float x = 1128.476;

char b[sizeof(x)];
memcpy(b, &x, sizeof(x));

// Iterate over b and send bytes
// [...]

受信側:

float y = 0;

char b[sizeof(x)];

// Store 4 bytes representing the float into b
// [...]

// Rebuild the float
memcpy(&y, b, sizeof(y));

最後に、送信側float yと同じ表現を持つ受信側がありfloat xます。

于 2012-04-14T10:45:09.957 に答える
0

(char *)「送信」側でバイトサイズのポインタを取得し、参照されているオブジェクトを繰り返し処理するだけで、同じアーキテクチャ、メモリレイアウト、バイトエンディアンなどの2台のマシン間で必要なすべてのバイナリデータを送信できます。そのオブジェクトのバイト数。「受信」側では、同じサイズのオブジェクト(float、long、struct foo)を割り当て、バイトを1つずつ受信して、各バイトが受信された後にポストインクリメントされるバイトサイズのポインターに入れます。

送信側-

void sendObject(const void *object, size_t size) {
  char *outputCursor = (char *) object;

  for (;size > 0;size--)
    yourSendAByteFunction(*outputCursor++);
}

受信側では、yourReceiveAByteFunction()が有効なバイトに対して0..255を返し、「受信エラー」に対して-1を返すと仮定すると、これを行うことができます-

int receiveObject(void *object, size_t size) {
  char *inputCursor = (char *) object;

  for (;size > 0;size--) {
    int nextByte = yourReceiveAByteFunction();
    if (nextByte < 0)
      return FALSE;

    *inputCursor++ = nextByte;
  }
  return TRUE;
}

関数が返されるようにsendObject()宣言するか、出力でエラーが発生したかどうかに応じて、関数で同じI/Oエラーチェックを実行できます。それはすべて、あなたがどれだけ複雑に耐えることができるか、そしてあなたが信頼できる伝送リンクを持っているかどうかに依存します。yourSendAByteFunction()TRUEFALSE

「シフト」バイトと、他のバイトを表す「シフト」バイトのプレフィックスが付いたバイト値のセットを使用して送信できないバイトがある場合は、データのカプセル化を少し行うこともできます。

于 2012-04-15T14:50:43.457 に答える
0

元の送信者は、float値を表すASCII文字列を送信しています。

値を受け取って表示するには、以下に示すように行を変更する必要があります。

(...appropriate setup...)
void loop() { 
  lcd.setCursor(0, 0);
  while (Serial.available() > 0) {       //Changed Line
      incomingByte = Serial.read();      //Added Line
      lcd.print(incomingByte);
  }
  delay(1000);
}

注:delay(1000)の代わりに、デバイスを同期するためにCRでシリアル出力を終了する方がよい場合。

于 2012-04-16T02:38:45.903 に答える