转载:http://blog.sina.com.cn/s/blog_c5c2bd470102vfhf.html

错误校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。

CRC运算时,首先将一个16位的寄存器预置为全1,然后连续把数据帧中的每个字节中的8位与该寄存器的当前值进行运算,仅仅每个字节的8个数据位与生成CRC,起始位和终止位以及可能使用的奇偶位都不影响CRC。在生成CRC

时,每个字节的8位与寄存器中的内容进行异或,然后将结果向低位移位,高位则用“0”补充,最低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值(0A001H)进行一次异或运算,如果最低位为0,不作任何处理。

上述处理重复进行,直到执行完了8次移位操作,当最后一位(第8位)移完以后,下一个8位字节与寄存器的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的最终值就是CRC

值。

生成一个CRC的流程为:

1预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

2把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

3将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。

4 如果最低位为0:重复第三步(下一次移位);如果最低位为1:将

CRC寄存器与一个预设的固定值(0A001H)进行异或运算。

5 重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。

6 重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

7 最终CRC寄存器的值就是CRC的值。

例程如下:

例程数据:0x03 0x10 0x00 0x01 0x00 0x08  校验码91ED

int main(int argc, char* argv[])

{

//printf("Hello World!\n");

int i = 0;

int j = 0;

int crc16 = 0xffff;

int data_CRC[6] = {0x03,0x10,0x00,0x01,0x00,0x08};

for (i = 0;i < 6;i++)

{

crc16 = crc16 ^ data_CRC[i];

for (j = 0;j < 8;j++)

{

if (crc16 & 0x01)

crc16 = (crc16 >> 1) ^ 0xa001;

else crc16 = crc16 >> 1;

}

}

printf("%X",crc16);

return 0;

}

CRC-16标准校验算法相关推荐

  1. C 语言 crc16校验算法,CRC16的标准校验算法及C语言实现(附代码)

    原标题:CRC16的标准校验算法及C语言实现(附代码) CRC码由发送端计算,放置于发送信息报文的尾部.接收信息的设备再重新计算接收到信息报文的CRC,比较计算得到的CRC是否与接收到的相符,如果两者 ...

  2. crc16几种标准校验算法及c语言代码

    一.CRC16校验码的使用 现选择最常用的CRC-16校验,说明它的使用方法. 根据Modbus协议,常规485通讯的信息发送形式如下: 地址 功能码 数据信息 校验码 1byte 1byte nby ...

  3. bcc校验位怎么算的_BCC(异或校验)、CRC、LRC校验算法

    一.校验算法 BCC(Block Check Character/信息组校验码),好像也是常说的异或校验方法 CRC(Cyclic Redundancy Check/循环冗余校验) LRC(Longi ...

  4. crc16检验 python_Python CRC16校验算法

    def crc16(x, invert): a = 0xFFFF b = 0xA001 for byte in x: a ^= ord(byte) for i in range(8): last = ...

  5. CRC-16原理及通用的16位CRC校验算法代码

    CRC-16原理及通用的16位CRC校验算法代码 循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detect ...

  6. 得到CRC16校验码的常见几个标准的算法及C语言实现

    CRC16常见的标准有以下几种,被用在各个规范中,其算法原理基本一致,就是在数据的输入和输出有所差异,下边把这些标准的差异列出,并给出C语言的算法实现. CRC16_CCITT:多项式x16+x12+ ...

  7. 常用校验算法CRC、MD5、SHA_转

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...

  8. 常用的简单校验算法:校验和,异或校验,crc校验,LRC校验,补码求和,checksum

    常用的简单校验算法:校验和,异或校验,crc校验,LRC校验,补码求和,checksum 相关思路和源码来自网络,自己只是整理, 做笔记用. 并未完整完善正确归纳,只是个人理解初步做笔记记录. 在实现 ...

  9. CRC校验算法的解析,暨对网上的CRC详解的补充

    一.CRC的形象理解 本文面向对CRC校验有一定基础的读者,如果你不懂,请戳这里.维基百科还有图解版的. 在CRC的具体实现中,如果要计算CRC的数据很长,一般都会用到寄存器,用来保存当前的计算到的C ...

最新文章

  1. SpringBoot接口频繁超时,长时间找不到原因,我用 Arthas 定位到了
  2. mysql导入导出sql文件
  3. jQuery Easing 动画效果扩展--使用Easing插件,让你的动画更具美感。
  4. python找与7相关的数_Python3.7 列表中有关增删改查的语句和函数
  5. 【verilog 语法】always 和 always@(*) 的区别
  6. Python—实训day2—爬虫案例1:访问百度贴吧
  7. 《ETL原理及应用》学习笔记 ·004【kettle的使用-2】
  8. 火山引擎智能容器云 veCompass v3.0 重磅发布!
  9. ObjectDetecionAPI TypeError: __new__() got an unexpected keyword argument 'serialized_options'
  10. leetcode之四数相加
  11. python wxpython常用控件实例
  12. 数据结构:线性表的顺序存储结构,实现集合的交差并补
  13. 三层交换机也不贵:自己动手做三层交换机
  14. C# XmlHelper
  15. android studio字体加粗属性,android textview字体加粗 Android studio最新水平居中和垂直居中...
  16. SwiftUI AVKit 之合并和叠加音频mp3 并输出
  17. frame组件+pack()来布局定位组件,实例讲解
  18. 2021-2022学年广州市育才实验学校九年级第一学期期中考试英语试题
  19. android app权限_如何限制Android App权限
  20. debian配置网卡

热门文章

  1. 作品-网站 - [二次开发] 融锦易贷网
  2. android jpct ae教程,jPCT-AE - Android开源项目 - 组件类库 - JAVA开源项目 - 开源吧
  3. Vue 如何调试手机端网页,VConsole 手机网页的前端 console 调试面板
  4. 校园考勤不再形同虚设
  5. MAC苹果Jupyter代码自动补全方法 亲测可
  6. Romberg算法(龙贝格求积公式C语言实现)
  7. Excel如何合并多个列的数据并插入一些符号?
  8. Python生成Code128C条形码:打印高效、识别准确
  9. 【学习笔记】SpringAOP的用法全解
  10. 行式数据库与列式数据库的对比