这几天都在做通道门的案子,因为公司要求要更换新的Reader,所以不得不重新编写新的固件.每个公司的Reader都有不同的通讯协议,对于这些读写器的指令厂家都会详细给出.每个厂家的查询消息和应答消息结构都不相同,帧数据格式也不一样,一般会有:帧头、数据长度、设备地址、命令序号、功能代码、数据和CRC校验,这CRC校验着实让人头疼,花了不少时间.
通信消息的错误检测使用CRC16进行数据校验。校验域从信息长度字段首字节开始,包括信息长度、读写器编号和信息部分(指功能代码、命令序号和数据3个域)。采用CRC_CCITT多项式 x16 + x12 + x5 + 1 = 0x8408,初始值为0x0000。
// 功能: 返回CRC16校验码
// 输入: pSrc – 源字符串指针
// nSrcLen – 源字符串长度
// 输出: pDst – 目标字符串指针
// 返回: 校验位长度
- GetCRC16(const BYTE* pSrc, BYTE* pDst, int nSrcLen)
- {
- unsigned int currentValue = 0x0000;
- int i,j;
- // 按位计算校验
- for(int i=0; i < nSrcLen; i++)
- {
- currentValue = currentValue ^ pSrc[i];
- for(int j = 0; j < 8; j++)
- {
- if(currentValue & 0x0001)
- {
- currentValue = (currentValue >> 1) ^ 0x8408;
- }
- else
- {
- currentValue = (currentValue >> 1);
- }
- }
- }
-
- // 校验位
- pDst[0] = (~currentValue >> 8) & 0x00FF;
- pDst[1] = ~currentValue & 0x00FF;
-
- }
阅读(4624) | 评论(0) | 转发(1) |