我做了一个由3个Zigbee,2个路由器(Zigbee S2C' s)和1个协调器(Zigbee S2)组成的设置。每个路由器都连接到arduino nano,它收集来自2个FSR和IMU(帧类型:zigbee传输请求和数据包大小46字节)的数据,并将其发送到连接到arduino UNO的协调器。所有Xbees都处于API模式2,工作波特率为115200.我正在使用名为" Simple Zigbee Library"将所有收集的数据发送给协调员。数据的收集和发送工作正常,除了在途中丢失数据包。纳米的样本数据独立地在25Hz左右的频率。协调器尝试在每个循环中读取zigbees发送的数据(当然使用库),但不幸的是,它似乎只接收了大约40-45个样本。(应该是25 * 2 =总共50个样本) 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();
}
答案 0 :(得分:0)
虽然您声称使用的是115,200bps,但已发布的代码显示您打开9600波特的串行端口,绝对不足以达到2500字节/秒(50个数据包/秒* 45个字节/数据包* 110%的开销)来自XBee并由printPacket()
转储。请记住,802.15.4始终为250kbps,而XBee模块的串行端口配置仅用于与主机进行本地通信。
确保您的路由器正在发送单播(而非广播)数据包,以防止无线电流量下降。
在对协调器上的代码进行故障排除之前,您应该验证发送是否正常。更新路由器上的代码,以查看是否为每个发送的数据包获得了成功的传输状态数据包。瞄准50Hz似乎有点多 - 你每20ms尝试发送45个字节(就是API帧的完整大小?)。
您是否在Arduino上为XBee模块和Serial.print()
使用硬件串口?每次致电printPacket()
需要多长时间?如果将printPacket()
中的代码减少到最低限度(发送方地址的最后一个字节和1字节帧ID),您是否看到所有数据包都通过(表明您已经过了)花太多时间倾倒数据包)。
答案 1 :(得分:0)
我关注你在循环中使用的代码。我不知道Arduino如何工作的深层内部,但10ms的延迟会阻止其他代码处理数据吗?如果你简化它会怎么样:
void loop()
{
xbee.read();
// Process any complete frames.
while (xbee.isComplete()){
Serial.print("\nIncoming Message: ");
printPacket( xbee.getIncomingPacketObject() );
}
}
但是在走得太远之前,你应该通过将协调器连接到PC上的终端仿真器来监视帧速率来解决问题。如果所有帧都到达,那么协调器就会出现问题。如果他们不在,请先处理您的路由器代码。