串口数据包解析
//先描述一下问题的背景,我用3个已知坐标的传感器,去定位一个未知的传感器,得到的坐标信息通过一个网关(硬件)传给pc串口,但是传过来一堆数据如0C C0 E0 67 2E E6 02 22 E4 92 00 18 10 00 00 00 F8 FF 代表的是x坐标=1.0 其后的00 00代表的是y坐标=0,但我不知道具体是怎么换算的,下面是具体的数据打包发送程序
//cc2430传感器作为网关给pc串口发送数据,LocDongle_ProcessMSGCmd( afIncomingMSGPacket_t *pkt )函数的功能是处理各个节点的数据
static void LocDongle_ProcessMSGCmd( afIncomingMSGPacket_t *pkt )
{
#if defined ( ZBIT )
switch ( pkt->clusterId )
{
case LOCATION_BLINDNODE_RESPONSE: //定位节点应答
case LOCATION_BLINDNODE_CONFIG://定位节点配置
blindNodes[0].addr = pkt->srcAddr.addr.shortAddr;
blindNodes[0].ep = pkt->srcAddr.endPoint;
break;
default:
break;
}
#else
#include "SPIMgr.h"
//所有引入信息从串口发送给pc
// All incoming messages are sent out the serial port as a SYS_APP_MSG.
uint16 cmd = SPI_RESPONSE_BIT | SPI_CMD_SYS_APP_MSG;
// DstEP + SrcAddr + SrcEP + cId + len = 1+2+1+2+1
uint8 buf[SPI_0DATA_MSG_LEN + 7];
uint8 *pBuf = buf;
uint8 succ = FALSE;
*pBuf++ = SOP_VALUE; // 操作系统值0X02
*pBuf++ = (uint8)(HI_UINT16( cmd )); //0X10
*pBuf++ = (uint8)(LO_UINT16( cmd )); //0X10
*pBuf++ = pkt->cmd.DataLength + 7; //数据长度
*pBuf++ = LOCATION_DONGLE_ENDPOINT; //0XCB
*pBuf++ = LO_UINT16( pkt->srcAddr.addr.shortAddr );//
*pBuf++ = HI_UINT16( pkt->srcAddr.addr.shortAddr );//网络地址
*pBuf++ = pkt->srcAddr.endPoint; //终端地址
*pBuf++ = LO_UINT16( pkt->clusterId ); //串ID
*pBuf++ = HI_UINT16( pkt->clusterId ); //
*pBuf++ = pkt->cmd.DataLength; //坐标数据长度
//(void)HalUARTWrite( SPI_MGR_DEFAULT_PORT, buf, 11 );
if ( HalUARTWrite( SPI_MGR_DEFAULT_PORT, buf, 11 ) )
{
//(void)HalUARTWrite( SPI_MGR_DEFAULT_PORT, pkt->cmd.Data, pkt->cmd.DataLength);
if ( HalUARTWrite( SPI_MGR_DEFAULT_PORT, pkt->cmd.Data, pkt->cmd.DataLength) )
{
cmd = SPIMgr_CalcFCS( buf+1, 10 ) ^
SPIMgr_CalcFCS( pkt->cmd.Data, pkt->cmd.DataLength );
//去除buf第一位操作系统值,然后进行异或校验(这一块我看的稀里糊涂的,尽管有注释我还是不明白,有没有高手用如上面所给的数据具体操作一下,是在看不明白最后是怎么异或操作的)
if ( HalUARTWrite( SPI_MGR_DEFAULT_PORT, (uint8 *)(&cmd), 1 ) )//发送数据位
{
succ = TRUE;
}
}
}
#endif
}
//上面的程序代码是用来处理各个节点发送给网关的有效数据,包括参考节点的配置数据,定位节点的配置数据等,这些数据包含了操作系统值,节点网络地址,有效数据长度,串ID,坐标数据长度,坐标信息等,这些数据被收集以后,首先通过串口发送给pc,然后对这些数据进行校验,校验的方法是去除数据操作系统值,即第一位,对各位数据进行异或计算,校验计算程序清单如下:
byte SPIMgr_CalcFCS(unit8 *msg_ptr, unit8 len)
{
byte x;
byte xorResult;
xorResult=0;
for(x=0;x<len;x++,msg_ptr++)
xorResult =xorResult^*msg_ptr;//异或计算
return(xorResult);//返回校验值
}