Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128396
  • 博文数量: 22
  • 博客积分: 596
  • 博客等级: 二等列兵
  • 技术积分: 874
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-06 12:09
个人简介

Enjoy code,enjoy life!

文章分类
文章存档

2013年(11)

2012年(11)

分类: C/C++

2012-09-19 11:02:47

   这几天都在做通道门的案子,因为公司要求要更换新的Reader,所以不得不重新编写新的固件.每个公司的Reader都有不同的通讯协议,对于这些读写器的指令厂家都会详细给出.每个厂家的查询消息和应答消息结构都不相同,帧数据格式也不一样,一般会有:帧头、数据长度、设备地址、命令序号、功能代码、数据和CRC校验,这CRC校验着实让人头疼,花了不少时间.

通信消息的错误检测使用CRC16进行数据校验。校验域从信息长度字段首字节开始,包括信息长度、读写器编号和信息部分(指功能代码、命令序号和数据3个域)。采用CRC_CCITT多项式 x16 + x12 + x5 + 1 = 0x8408,初始值为0x0000

// 功能: 返回CRC16校验码

// 输入: pSrc – 源字符串指针

//       nSrcLen – 源字符串长度

// 输出: pDst – 目标字符串指针

// 返回: 校验位长度


点击(此处)折叠或打开

  1. GetCRC16(const BYTE* pSrc, BYTE* pDst, int nSrcLen)
  2. {
  3.     unsigned int currentValue = 0x0000;
  4.          int i,j;
  5. // 按位计算校验
  6.     for(int i=0; i < nSrcLen; i++)
  7.     {
  8.         currentValue = currentValue ^ pSrc[i];
  9.         for(int j = 0; j < 8; j++)
  10.         {
  11.             if(currentValue & 0x0001)
  12.             {
  13.                 currentValue = (currentValue >> 1) ^ 0x8408;
  14.             }
  15.             else
  16.             {
  17.                 currentValue = (currentValue >> 1);
  18.             }
  19.         }
  20.     }
  21.     
  22. // 校验位
  23.     pDst[0] = (~currentValue >> 8) & 0x00FF;
  24.     pDst[1] = ~currentValue & 0x00FF;
  25.     

  26. }


 



 

 

阅读(4624) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~