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.

终端使能NV_RESTORE和HOLD_AUTO_START断电重启后devState不正确

Other Parts Discussed in Thread: Z-STACK, CC2530

协议栈:Z-Stack Home 1.2.2a

CPU:CC2530

使用情况:

1.终端节点,使能NV_RESTORE和HOLD_AUTO_START;

2.希望节点在未加入过网络时保持devState=DEV_HOLD;

3.希望节点在加入过网络,断电重启或软复位后,恢复至先前网络状态且devState=DEV_END_DEVICE。

问题:

上面描述的第3点,网络环境能够恢复,但是devState依然为DEV_HOLD,导致应用层无法处理ZDO_STATE_CHANGE为DEV_END_DEVICE的事件,请问如何解决?

谢谢

  • 可以通过定时器,设置一个中断函数,定时检测这些,如果没满足要求,就调用初始化函数,初始化到想要的状态。如果满足要求了,就继续等待下次中断

  • @gaoyang9992006

    我理解你说的意思是我在应用层自己定时判断devState然后改变他?

    可是这样就达不到我的目的了呀,这个应该协议栈干的事情(断电重启后恢复到之前的状态),不是么

  • 你解决了没有,我也出现了同样的问题

  • @Tianhao Wang 

    我解决了。

         (1)预编译NV_RESTORE
         (2)在ZDAPP.c,ZDOInitDevice()中增加粗体字内容:
      if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE )
      {
        ...
      }
      else if( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE )
      {
        startDelay = 0;
      }
    这是我的方法,你试试行不行
  • 谢谢你的回答,我也解决了不过我是在入网前加了

     if(devState == DEV_HOLD )
      {
        devState = DEV_INIT;
      }

  • 我认为你这种做法不妥, 那如果设备出厂后第一次上电呢?即它没有加入过网络,一上来就你将它设置DEV_INIT? 

    我觉得最好是在应用程序上 加一个bool 变量,入网后将其写入NV flash 中, 下次上电前判断一下, 如果是入过网的, 则调用ZDOstartdevice 

  • 恩,确实,我的设计是出厂使用NLME_RestoreFromNV()函数查询终端是否在网络内

    如果不在网络内就调用ZDApp_StopJoiningCycle();函数让他不自动组网。

    只有通过串口收到组网命令才调用ZDApp_StartJoiningCycle();函数组网。组网前改变网络模式为DEV_INIT

    我以前帖子问过这个问题,TI工程师说的就算进入了HOLD模式重新上电组网也可以成功,不过我断电后还是不能组网成功。