4

我无法通过简单的 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);
}

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

谢谢

4

3 回答 3

3

您可以发送floatin 字节并在接收器处重建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

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

于 2012-04-16T02:38:45.903 回答
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()函数中执行相同的 I/O 错误检查,方法是声明yourSendAByteFunction()它返回TRUEFALSE取决于输出中是否发生错误。这完全取决于您能承受多少复杂性,以及您是否拥有可靠的传输链路。

如果您有无法传输的字节,您还可以进行一些数据封装,方法是使用“shift”字节和以“shift”字节为前缀的一组字节值来表示其他字节。

于 2012-04-15T14:50:43.457 回答