我做了一个由3个Zigbee,2个路由器(Zigbee S2C's)和1个协调器(Zigbee S2)组成的设置。每个路由器都连接到从2个FSR和一个IMU(帧类型:zigbee传输请求和包大小为46字节)收集数据的arduino nano,并将其发送给连接到arduino UNO的协调器。所有的Xbe都处于API模式2并且工作在115200的波特率。我正在使用名为“Simple Zigbee Library”的库将所有收集的数据发送给协调器。数据的收集和发送工作正常,除了有丢包的情况。纳米的采样数据在25Hz左右的频率独立。协调员试图在每个循环中读取Zigbees发送的数据(当然使用库),但不幸的是,它似乎只能接收大约40-45个样本(应该是25 * 2 =从2 xbees)。有人可以提出为什么会发生这种情况。我需要尽可能少的数据丢失,以便我的设置实现其动机。任何形式的帮助表示赞赏。为什么Zigbee arduino设置中的数据包丢失?
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.htm: /电子学.stackexchange.com/questions/36932/xbee-how-does-it-deal-with-collisions – Aniket
好极了,但我想到的是比这更高的水平。* CSMA/CA *在合适的情况下可以并最终不会阻止*冲突*,尽管拥有它肯定会更好。 *更高级别的协议*应该要求每个数据包被确认*,并且如果在给定的*超时*内没有收到* ACK *,则强制再次发送数据包。上次我和* ZigBee *一起工作时,虽然我承认我没有使用Arduino *,但我必须自己实现这一点。 –