跨Xbee网络传输浮点值

时间:2012-04-13 23:31:32

标签: c++ arduino wireless xbee

我在通过简单的2节点Xbee网络传输浮动时遇到问题。

我知道Xbee系统通过字节传输包,所以我可以发送一个字符,但是我发送的东西比我发送的更多,我似乎无法在任何地方找到任何文档。

这是我当前的(基本)代码。

发信人:

(... 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);
}

任何关于让浮动成功传输的提示都会很棒吗?或者如果它已经正确传输,如何正确阅读?

由于

3 个答案:

答案 0 :(得分: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的相同代表。

答案 1 :(得分:0)

您可以通过简单地在“发送”端获取字节大小的指针(char *),在两台具有相同架构,内存布局,字节字节序等的机器之间发送所需的所有二进制数据,并且迭代引用的对象以获取该对象中的字节数。在“接收”端,您分配一个相同大小的对象(float,long,struct foo),并逐个接收字节到一个字节大小的指针,该指针在接收到每个字节后后递增。

在发送方 -

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()yourSendAByteFunction()函数中执行相同的I / O错误检查,以便它返回TRUEFALSE,具体取决于是否发生错误在输出中。这一切都取决于您可以承受的复杂程度,以及您是否拥有可靠的传输链接。

如果你有一个“移位”字节无法传输的字节,你也可以进行一些数据封装,一组字节值以“shift”字节为前缀来表示其他字节。

答案 2 :(得分:0)

您的原始发件人正在发送代表浮点值的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);
}

注意:如果最好用CR来终止串行输出以同步设备而不是延迟(1000);