This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

在应用层判断节点状态变化,同一个状态变化,应用层接收到两次

Other Parts Discussed in Thread: Z-STACK

else if( zclSample_NwkState == DEV_END_DEVICE )
{
 HalUARTWrite(HAL_UART_PORT_0, "DEV_END_DEVICE", 14);
}
else if( zclSample_NwkState == DEV_NWK_DISC )
{
 HalUARTWrite(HAL_UART_PORT_0, "DEV_NWK_DISC", 12);
}

如上面代码,节点状态发生变化,在这里会调用两次,是什么原因?

例如DEV_NWK_DISC节点处于此状态时,应用层会接收到两次。节点状态为DEV_END_DEVICE或者DEV_NWK_ORPHAN都是同样的问题。

  • 请使用TI的原始例程试一下,没遇到过。
  • 你好 Alvin Chen!
    按照你说的,我使用了新的协议栈,Z-Stack Home 1.2.2a.44539,使用的是doorlock的例程,修改了串口的MT_UART_DEFAULT_BAUDRATE和MT_UART_DEFAULT_OVERFLOW,然后在应用层做了简单修改,如下:
    case ZDO_STATE_CHANGE:
    zclSampleDoorLock_NwkState = (devStates_t)(MSGpkt->hdr.status);

    // now on the network
    if ( (zclSampleDoorLock_NwkState == DEV_ZB_COORD) ||
    (zclSampleDoorLock_NwkState == DEV_ROUTER) )
    {
    }
    else if( zclSampleDoorLock_NwkState == DEV_END_DEVICE )
    {
    #ifndef HOLD_AUTO_START
    giDoorLockScreenMode = DOORLOCK_MAINMODE;
    zclSampleDoorLock_LcdDisplayUpdate();
    #endif
    HalUARTWrite(HAL_UART_PORT_0, "hello world!", 12);
    #ifdef ZCL_EZMODE
    zcl_EZModeAction( EZMODE_ACTION_NETWORK_STARTED, NULL );
    #endif
    }
    break;
    其中的HOLD_AUTO_START和ZCL_EZMODE在预编译中都设置为x。
    结果串口调试工具显示
    [2019-06-13 14:59:50.963]# RECV HEX>
    FE 06 41 80 01 02 00 02 06 03 C3 -- 这里是MT层输出的 不用管

    [2019-06-13 14:59:54.037]# RECV HEX>
    68 65 6C 6C 6F 20 77 6F 72 6C 64 21 68 65 6C 6C 6F 20 77 6F 72 6C 64 21

    [2019-06-13 15:00:09.715]# RECV ASCII>
    ?A€ ? -- 这里是MT层输出的 不用管

    [2019-06-13 15:00:12.781]# RECV ASCII>
    hello world!hello world!
  • 建议你去debug,不知道你这个是串口造成。