话说博主这两天使用CC2531执行绑定操作的时候,出现点小插曲。首先EndDevice在按键处理程序中,发送ZDP_MatchDescReq()广播匹配端点描述符请求,这个函数只对允许绑定的设备有效。
ZDP_MatchDescReq()请求函数如下。
dstAddr.addrMode = AddrBroadcast;
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
WSN_PROFILE_ID,
/*WSN_MAX_IN_CLUSTERS, (cId_t *)WSN_ClusterList,*/
0,(cId_t *)NULL,
WSN_MAX_OUT_CLUSTERS, (cId_t *)WSN_ClusterList,
FALSE );
允许绑定的目的设备,ZDO层自动处理Match请求,无需手动处理,ZDO层会对Req请求进行响应。EndDevice如果注册了ZDO层消息Match_Desc_rsp,那么设备将会在SYS_EVENT_MSG事件中的ZDO_CB_MSG里收到Match_Desc_rsp这个响应。注册接收响应的消息方法如下:
ZDO_RegisterForZDOMsg( WSN_TaskID, Match_Desc_rsp );
在ZDO_CB_MSG处理函数为WSN_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
该函数的参数zdoIncomingMsg_t 的数据结构如下:
typedef struct { osal_event_hdr_t hdr; zAddrType_t srcAddr; uint8 wasBroadcast; cId_t clusterID; uint8 SecurityUse; uint8 TransSeq; uint8 asduLen; uint16 macDestAddr; uint8 *asdu; } zdoIncomingMsg_t;我们使用zdoIncomingMsg_t的clusterID来判断消息类型。在这里,我们调试的时候,发现接收到的ClusterID值为-32762,而我们要接收的ClusterID为Match_Desc_rsp。该值的定义在ZDOProfile.h
#define Match_Desc_rsp (Match_Desc_req | ZDO_RESPONSE_BIT)
其中
#define Match_Desc_req ((uint16)0x0006)
#define ZDO_RESPONSE_BIT ((uint16)0x8000)
所以Match_Desc_rsp = 0x8006.
无符号的值为32774,其二进制为1000000000000110,
由于数字在计算机中是以补码形式存在的,一个有符号的-32762与无符号的32764作比较,我们就得计算其补码。补码,原码,反码请看这篇文章,讲的很详细。
http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
我们计算无符号的值的反码为1111111111111001,由于是负数,所以补码要在原码的基础上再加1.
得到补码为1111111111111010,计算其有符号的值就是-32762。
而调试时值正是以计算机的补码为基础的。所以这两者是相等的,也就是收到了该响应。