文章目录
笔记前言
一、CRC是什么?
二、CRC基本原理
1.原理介绍与练习
2.CRC-8 示例代码
总结
笔记前言
此篇是学习CRC基本原理与实现的个人学习笔记,以备未来自己复习使用,也将自己学习心得分享给大家。
本篇笔记本着不造轮子的思路,为大家和自己提供了相关的优秀文章和视频的链接,并且以一个至少符合我个人的学习路径的方式为大家展开介绍。
一、CRC是什么?
CRC即循环冗余检验(Cyclic Redundancy Check)是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 正如那个不起眼的封面所见,无人机中常用的mavlink协议也采用了CRC作为数据的检验方法。这也是我接触CRC的最直接的原因。
下面给出了3种不同的CRC算法,给大家以直观感受,之后将详细说明。
CRC算法名
多项式公式
宽度
多项式
初始值
结果异或值
输入反转
输出反转
CRC-4/ITU
x4+x+1
4
0x13
0x00
0x00
true
true
CRC-8
x8+x2+x+1
8
0x107
0x00
0x00
false
false
CRC-16/XMODEM
x16+x12+x5+1
16
0x11021
0x0000
0x0000
false
false
二、CRC基本原理
1.原理介绍与练习
看下面这篇文章时记得边看边跟着文章里的例子一起动笔算一算。 一篇关于CRC原理很不错的博客
OK,看完了吧。觉得还有点懵?没关系,接下来这的直观的视频展示将帮助你很好的消化吸收。 一个关于CRC原理与实现非常棒的视频,强烈推荐!
现在明白了吧!为了巩固一下刚才的学习成果,让我们来做一两道题试试。 一个在线CRC计算器 打开这个在线计算器,选择如上图所示的模型(这大抵是该计算器可选算法里最适合手算的啦)然后输入自己需要检验的数据(hex),自己手算一下与计算器结果对比。
2.CRC-8 示例代码
纸上得来终觉浅,还是建议自己码一下简单的demo亲手实现CRC,这样体会更深刻! 再看代码前,我再说明一下第一部分中CRC算法表头的意思。
算法名称:这个就没啥好说的了,就是名字嘛
多项式公式:大家看了推荐的第一篇博客内容也肯定知道了,这里不做解释了
宽度:就是最后校验码的位长
多项式:就是多项式公式对应的值,(这里把最高位给略去了,实际计算中最高位是有的)
初始值:就是CRC检验寄存器一开始的值(对应代码就是初始CRC值)
结果异或值:就是把数据进行模二除法后得到的结果进行异或的值
输入反转:就是把输入的数据进行反转:比如输入11100001,反转后就是10000111。这个的作用主要是数据传输时,一般是从低位传输,所以进行反转的话,我们就不需要把所有数据都得到了才能才是进行检验的计算。
输出反转:把计算得出的CRC校验码进行反转
好了,最后附上我的demo供大家参考,我写的其实很烂,但是实现了基本功能,就拿出来抛转引玉