关于协调器重新上电PanId改变问题
您好,现在我的网络里面有1个协调器和1个路由器(均编译了NV_INIT和NV_RESTORE),运行的程序是SerialApp,PanId是2,Chanel 0x0B,如果协调器先上电建立网络,然后路由器上电加入网络,双方串口发数据,均能正常接收,现在协调器重新上电,路由器一直工作,这时候发现协调器的PanId为3,加入不到原有的网络中;如果关掉路由器,协调器在重新上电,PanId为2,路由器在上电,还是可以正常收发数据;问题是我编译了NV_RESTORE和NV_INIT的,现在的解决办法是修改了下面的函数:
uint16 ZDApp_CoordStartPANIDConflictCB( uint16 panid )
{
#if defined ( NV_RESTORE )
return ( panid + 0 );
#else
return ( panid + 1 );
#endif
}
这样在路由器不掉电的情况下协调器重新上电后还能加入原有的网络,请告知问题的原因,谢谢!
你虽然在这个函数里面产生一个和原先一样的PANID,但是这个PANID得到以后会和现在的网络的PANID再次做比较,如果是冲突的话还是会回到这个函数里面来选择新的PANID,所以你这种做法的话会使coordinator一直出去PANID的choose的状态,也就是说一直在这个函数里面跑,直到你的router掉电,没有冲突的时候,那么选择一个panid+0的PANID,因为这个时候已经没有冲突了。
谢谢,其实加NV_RESTORE应该是没有问题的,可能的问题是我之前的ROUTER模块烧写过COORDINATOR的程序,所以NV中存在一些数据,导致现在的COORDINATOR不能用原有的PanId,现在将2个模块全部擦出程序,重新分别烧写COORDINATOR和ROUTER的程序,组网后协调器断电重启还是可以加入原来的网络。