这几天都在做通道门的案子,因为公司要求要更换新的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;
-
- }
阅读(4601) | 评论(0) | 转发(1) |