我在两个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的HEX中发送“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
所以,我猜我正在读数据正在发生变化,这也许就是为什么它可以用来获取数据。那么,在我阅读之前有没有办法“冻结”数据?
答案 0 :(得分:0)
我终于找到了发生的事情: 我使用的是NewSoftSerial(因为一个Serial显然还不够),它似乎是定时器(长时间超时)而我实际上使用的是TimerOne库或者#34; Thread.h&#34;库有点允许我使用中断。
好吧,整个事情显然被NSS的超时搞砸了,所以要注意你将来是否一起使用它们。我不得不从TimerOne切换到Thread.h(当然不是真正的线程),这样我就可以避免出现问题。
我还发现正常的Serial,与Arduino捆绑在一起,正在播放不好的东西以及定时器的东西。
非常感谢你试图帮助我,但这并不是我认为问题所在的地方。
Venix