crc校验c语言实现-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 127059
  • 博文数量: 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. }


 



 

 

阅读(4601) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图