测试其ZIGBEE协议栈的低功耗模式,TI确实花了不少功夫在这套协议栈上以及支撑的操作的系统OSAL,非常好用。做了几个简单的配置即可进入低功耗模式,并且数据采集、通信均正常。
担当我认为OK的时候,我把协调器关闭了,过了一段时间,重新打开,发现终端连不上了,测量了终端的电池电压(CR1220,40mA/H),已经没电了;问题的根源就是终端发现协调器不在线了,不停的去重连网络导致的,要知道重连过程是很耗电的。如何解决?找了网上的资料,如下:
/////////////////////////////////////////////////////////////////////////////////
这个我有研究过,如果不配置DEV_HOLD,设备会一直加网,直到有网络。如果想要设备隔一段时间再加网,可以参照下面的做法(需要注意的是,我只验证了设备会按照设定的时间起来加网,并不能说明降低了功耗)。
#define NWK_INIT_fAIL_MAX 5
UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )
{
……
if ( events & ZDO_NETWORK_INIT )
{
static uint8 initFailCounter = 0;
// Initialize apps and start the network
devState = DEV_INIT;
osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
//by asura 20140901
if(initFailCounter++ >= NWK_INIT_fAIL_MAX )
{
osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, 60000 );
initFailCounter = 0;
return(events ^ ZDO_NETWORK_INIT);
}
ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,
DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );
// Return unprocessed events
return (events ^ ZDO_NETWORK_INIT);
}
……
}
这样更改以后,设备上电会首先尝试5次加网,如果都失败,其后就会每1分钟起来加网一次。
另外,由于osal_start_timerEx()第二个参数为uint16类型的,这样就限制了延迟时间的大小,我想问下,怎么设置5分钟或更长时间的延迟?
//////////////////////////////////////////////////////
另外的网友答复:最新的协议栈中osal_start_timerEx函数的时间参数已经是32位的了,可以定义更长时间的定时器了。