osal_memset((uint8 *)&leaveReq,0,sizeof(NLME_LeaveReq_t));
osal_memcpy(leaveReq.extAddr,NLME_GetExtAddr(),Z_EXTADDR_LEN);
leaveReq.removeChildren =0;
leaveReq.rejoin =1;
leaveReq.silent = 0;
NLME_LeaveReq( &leaveReq );
加上红色部分就会堆栈溢出,不加就不会。不过在函数SampleApp_Init( uint8 task_id )中我使用了这个函数,也没有堆栈溢出。
而现在的表现情况就是使用这个函数后有时不能入网有时可以入网。该函数在终端中使用。我怀疑是不是在退网程序中我没有加该函数的原因。不过如果加了由于发生了堆栈溢出就会出现很多奇怪的问题。
James Chu:
try
leave_req.extAddr = NULL;
Tianhao Wang:
回复 James Chu:
leave_req.extAddr = NULL;后确实不会溢出,不过终端退网以后就不能加入网络了。硬件复位一下就可以了加入了。是怎么回事
Tianhao Wang:
回复 Tianhao Wang:
并不是leave_req.extAddr = NULL加不进网,我回到原来的程序也会出现这种情况
不过好像是随机的。我还没有找到规律
Aries Lord:
typedef struct{ uint8* extAddr; uint8 removeChildren; uint8 rejoin; uint8 silent;} NLME_LeaveReq_t;
很明显这个是个指针,不支持memcpy,你要赋值一个数组,然后指针指向数组。
Tianhao Wang:
回复 Aries Lord:
嗯,溢出确实是这个原因不过我定义了个数组DEV_ID,加入如下程序
osal_memcpy(DEV_ID,NLME_GetExtAddr(),Z_EXTADDR_LEN);//读取IEEEleaveReq.extAddr=DEV_ID;
这个根本就退不了网
Tianhao Wang:
回复 Tianhao Wang:
求解答,
Tianhao Wang:
回复 Tianhao Wang:
求解答
Tianhao Wang:
回复 Tianhao Wang:
求解答
wei shi5:
回复 Tianhao Wang:
你是设备请求退网还是协调器让设备离网啊,这俩不一样啊,如果是第一种情况你把rejion设false,还有exAddr=NULL,
其实官方例程SampleLight有,你没细看,
static void zclSampleLight_BasicResetCB( void ){ NLME_LeaveReq_t leaveReq; // Set every field to 0 osal_memset( &leaveReq, 0, sizeof( NLME_LeaveReq_t ) );
// This will enable the device to rejoin the network after reset. //leaveReq.rejoin = TRUE; leaveReq.rejoin = FALSE;
// Set the NV startup option to force a "new" join. zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
// Leave the network, and reset afterwards if ( NLME_LeaveReq( &leaveReq ) != ZSuccess ) { // Couldn't send out leave; prepare to reset anyway ZDApp_LeaveReset( FALSE ); }}
Tianhao Wang:
回复 wei shi5:
设备请求退网和协调器让设备离网是不一样,我的设备请求退网加密之前基本没有问题,加密过后才有问题,主要就是协调器让设备退网一直没有做好。