【发布时间】:2024-01-12 20:11:01
【问题描述】:
我做了一个由 3 个 Zigbee、2 个路由器(Zigbee S2C's)和 1 个协调器(Zigbee S2)组成的设置。每个路由器都连接到 arduino nano,后者从 2 个 FSR 和一个 IMU(帧类型:zigbee 传输请求和数据包大小 46 字节)收集数据并将其发送到连接到 arduino UNO 的协调器。所有的 Xbee 都处于 API 模式 2 并以 115200 的波特率工作。我正在使用一个名为“Simple Zigbee Library”的库将所有收集到的数据发送到协调器。数据的收集和发送工作正常,只是途中有数据包丢失。 nano 的样本数据独立于 25Hz 左右的频率。协调器尝试在每个循环中读取从 zigbees(当然使用库)发送的数据,但不幸的是,它似乎只接收到大约 40-45 个样本。(应该是 25*2=50 个样本总数来自 2 xbees)。任何人都可以提出为什么会这样。我的设置需要尽可能少的数据丢失才能实现其目的。任何形式的帮助表示赞赏。
P.S:可能很重要的一点是,协调器在每个循环中只从一个 xbee 读取数据。
谢谢。
void setup()
{
// Start the serial ports ...
Serial.begin( 115200 );
while( !Serial ){;} // Wait for serial port (for Leonardo only).
xbeeSerial.begin( 115200 );
// ... and set the serial port for the XBee radio.
xbee.setSerial( xbeeSerial );
// Set a non-zero frame id to receive Status packets.
xbee.setAcknowledgement(true);
}
void loop()
{
// While data is waiting in the XBee serial port ...
while( xbee.available() )
{
// ... read the data.
xbee.read();
// If a complete message is available, display the contents
if( xbee.isComplete() ){
Serial.print("\nIncoming Message: ");
printPacket( xbee.getIncomingPacketObject() );
}
}
delay(10); // Small delay for stability
// That's it! The coordinator is ready to go.
}
// Function for printing the complete contents of a packet //
void printPacket(SimpleZigBeePacket & p)
{
//Serial.print( START, HEX );
//Serial.print(' ');
//Serial.print( p.getLengthMSB(), HEX );
//Serial.print(' ');
//Serial.print( p.getLengthLSB(), HEX );
//Serial.print(' ');
// Frame Type and Frame ID are stored in Frame Data
uint8_t checksum = 0;
for( int i=10; i<p.getFrameLength(); i++){
Serial.print( p.getFrameData(i), HEX );
Serial.print(' ');
checksum += p.getFrameData(i);
}
// Calculate checksum based on summation of frame bytes
checksum = 0xff - checksum;
Serial.print(checksum, HEX );
Serial.println();
}
【问题讨论】:
-
您是否考虑过数据包冲突和数据损坏?通信协议是否足够先进以处理这些情况?
-
此链接表示:这些模块(MAC 和 PHY 层)使用的无线电由 IEEE 802.15.4 标准定义,该标准指定使用载波侦听多路访问和避免冲突或缩写为CSMA/CA.electronics.stackexchange.com/questions/36932/…
-
好极了,但我想到了比这更高级的东西。 CSMA/CA 在适当的情况下可以并且肯定无法防止 碰撞,尽管拥有它肯定比没有更好。 高层协议应该要求每个包被确认,如果在给定的超时。上次我使用 ZigBee 时,虽然我承认我没有使用 Arduino,但我必须自己实现。
-
感谢@PatrickTrentin 的快速回答。我在API 模式下使用Xbees,数据包已按照您的描述进行确认。我正在使用的库(“Simple Zigbee 库”)为我完成了所有繁重的工作。此外,我的实际代码以 115200 波特而不是示例中给出的 9600 波特运行。
-
很高兴知道,谢谢
标签: api arduino router serial-communication xbee