ZigBee Arduino,解析数据不正确
ZigBee Arduino, Incorrect parsed datas
我在 2 个 arduinos Uno 之间进行通信时遇到了一些问题。
Arduino1<>ZigBee >------------ < ZigBee < > Arduino2
我目前正在努力让他们相互理解。该消息目前在第一个 Arduino 到他的 Zigbee 然后到第二个 Zigbee 之间进展顺利。
Arduino1<>ZigBee>------------< ZigBee--X-- Arduino2
问题是:当我尝试在 Arduino2 上解析来自 Arduino1 的传入数据包的有效负载时,消息是不同的。
因为我使用的是 ZigBee API2,所以在 ZigBees 之间传输时消息上有一个 CRC,所以(经过一些调查)我确定数据包到达 ZigBee2 的地方是正确的(如果不是,数据包将被丢弃).
那么现在的重头戏是:
memmove(received,xbee_Rx.getData(),24);
当我收到数据包时
xbee.readPacket();
if (xbee.getResponse().isAvailable())
{
if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
{
xbee.getResponse().getZBRxResponse(xbee_Rx);
memmove(received,xbee_Rx.getData(),24);
for (int i = 0; i < 24; i++) {
Serial.print(received[i],HEX);
}
}
}
虽然我在 Arduino1 上以十六进制发送这个“4144000000000000446B3AB4083E8484258”
我在 Arduino2 的 HEX 中收到了这个“414400000000000008C201862419B5”
这是一个例子,数据总是错误的(除了前两个字节)。结果有点随机,对我来说无法使用。
我也尝试用
解析
for (int i = 0; i < 24; i++) {
received[i] = xbee_Rx.getData()[i];
Serial.print(received[i],HEX);
}
但结果还是一样。
所以我的问题是:我是不是解析错了? getData()函数有问题吗?
谢谢:-)
编辑:
经过一些研究,我发现如果我这样做
for (int i = 0; i < sizeof(xbee_Rx.getData()); i++) {
Serial.print(xbee_Rx.getData()[i],HEX);
}
Serial.println();
for (int i = 0; i < sizeof(received); i++) {
Serial.print(received[i],HEX);
}
数据不一样。
414400000000000008C201885358C80
414400000000000008C201862419E6
而不是
4144000000000000441A6E9B407DDD494258
所以,我想当我阅读数据时,数据正在发生变化,这可能就是它搞砸数据的原因。那么,在我阅读数据之前,有什么方法可以 "freeze" 数据吗?
我终于找到了发生了什么:
我正在使用 NewSoftSerial(因为一个 Serial 显然是不够的)而且它似乎 f**ck 计时器(长时间超时)而且我实际上是在使用 TimerOne 库或 "Thread.h" 库来让我使用中断。
嗯,整个事情显然被 NSS 超时搞砸了,所以如果你将来一起使用它们,请小心。我不得不从 TimerOne 切换到 Thread.h(当然这不是真正的线程),这样我就可以避免出现问题。
我还发现普通的 Serial,与 Arduino 捆绑在一起的那个,在玩定时器的时候也玩得很糟糕。
非常感谢你试图帮助我,但问题并不是我想的那样。
威尼斯
我在 2 个 arduinos Uno 之间进行通信时遇到了一些问题。
Arduino1<>ZigBee >------------ < ZigBee < > Arduino2
我目前正在努力让他们相互理解。该消息目前在第一个 Arduino 到他的 Zigbee 然后到第二个 Zigbee 之间进展顺利。
Arduino1<>ZigBee>------------< ZigBee--X-- Arduino2
问题是:当我尝试在 Arduino2 上解析来自 Arduino1 的传入数据包的有效负载时,消息是不同的。
因为我使用的是 ZigBee API2,所以在 ZigBees 之间传输时消息上有一个 CRC,所以(经过一些调查)我确定数据包到达 ZigBee2 的地方是正确的(如果不是,数据包将被丢弃).
那么现在的重头戏是:
memmove(received,xbee_Rx.getData(),24);
当我收到数据包时
xbee.readPacket();
if (xbee.getResponse().isAvailable())
{
if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
{
xbee.getResponse().getZBRxResponse(xbee_Rx);
memmove(received,xbee_Rx.getData(),24);
for (int i = 0; i < 24; i++) {
Serial.print(received[i],HEX);
}
}
}
虽然我在 Arduino1 上以十六进制发送这个“4144000000000000446B3AB4083E8484258”
我在 Arduino2 的 HEX 中收到了这个“414400000000000008C201862419B5”
这是一个例子,数据总是错误的(除了前两个字节)。结果有点随机,对我来说无法使用。
我也尝试用
解析for (int i = 0; i < 24; i++) {
received[i] = xbee_Rx.getData()[i];
Serial.print(received[i],HEX);
}
但结果还是一样。
所以我的问题是:我是不是解析错了? getData()函数有问题吗?
谢谢:-)
编辑: 经过一些研究,我发现如果我这样做
for (int i = 0; i < sizeof(xbee_Rx.getData()); i++) {
Serial.print(xbee_Rx.getData()[i],HEX);
}
Serial.println();
for (int i = 0; i < sizeof(received); i++) {
Serial.print(received[i],HEX);
}
数据不一样。
414400000000000008C201885358C80
414400000000000008C201862419E6
而不是 4144000000000000441A6E9B407DDD494258
所以,我想当我阅读数据时,数据正在发生变化,这可能就是它搞砸数据的原因。那么,在我阅读数据之前,有什么方法可以 "freeze" 数据吗?
我终于找到了发生了什么: 我正在使用 NewSoftSerial(因为一个 Serial 显然是不够的)而且它似乎 f**ck 计时器(长时间超时)而且我实际上是在使用 TimerOne 库或 "Thread.h" 库来让我使用中断。
嗯,整个事情显然被 NSS 超时搞砸了,所以如果你将来一起使用它们,请小心。我不得不从 TimerOne 切换到 Thread.h(当然这不是真正的线程),这样我就可以避免出现问题。
我还发现普通的 Serial,与 Arduino 捆绑在一起的那个,在玩定时器的时候也玩得很糟糕。
非常感谢你试图帮助我,但问题并不是我想的那样。
威尼斯