Z-Stack 绑定中的原码补码反码小插曲

话说博主这两天使用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。

而调试时值正是以计算机的补码为基础的。所以这两者是相等的,也就是收到了该响应。






你可能感兴趣的:(Z-Stack 绑定中的原码补码反码小插曲)