我在通过简单的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);
}
任何关于让浮动成功传输的提示都会很棒吗?或者如果它已经正确传输,如何正确阅读?
由于
答案 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错误检查,以便它返回TRUE
或FALSE
,具体取决于是否发生错误在输出中。这一切都取决于您可以承受的复杂程度,以及您是否拥有可靠的传输链接。
如果你有一个“移位”字节无法传输的字节,你也可以进行一些数据封装,一组字节值以“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);