为什么Zigbee arduino设置中缺少数据包?

时间:2017-02-19 12:56:30

标签: api arduino router serial-communication xbee

我做了一个由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读取数据。

As can be seen under the "Source" heading of this image of data received by the coordinator, "19" and "106" are the addresses of the routers and there are data packets dropped intermittently

谢谢。

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();
}

2 个答案:

答案 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上的终端仿真器来监视帧速率来解决问题。如果所有帧都到达,那么协调器就会出现问题。如果他们不在,请先处理您的路由器代码。