原文作者:王超的独立博客
出处:http://www.wangchaochao.top/2020/09/20/Principle-and-implementation-of-CRC/
前言
最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了一下笔记。
一个完整的数据帧通常由以下部分构成:
![d87978532d99deeb5644a65cea779816.png](https://i-blog.csdnimg.cn/blog_migrate/20423225ff674a814fb2bcdef7615dec.jpeg)
校验位是为了保证数据在传输过程中的完整性,采用一种指定的算法对原始数据进行计算,得出的一个校验值。接收方接收到数据时,采用同样的校验算法对原始数据进行计算,如果计算结果和接收到的 校验值一致 ,说明数据校验正确,这一帧数据可以使用,如果不一致,说明传输过程中出现了差错,这一帧数据丢弃,请求重发。
常用的校验算法有奇偶校验、校验和、CRC,还有LRC、BCC等不常用的校验算法。
以串口通讯中的奇校验为例,如果数据中1的个数为奇数,则奇校验位0,否则为1。
例如原始数据为:0001 0011,数据中1的个数(或各位相加)为3,所以奇校验位为0。这种校验方法很简单,但这种校验方法有很大的误码率。假设由于传输过程中的干扰,接收端接收到的数据是0010 0011,通过奇校验运算,得到奇校验位的值为0,虽然校验通过,但是数据已经发生了错误。
![f9f009ff94617fcc84055bfa098f5f9f.png](https://i-blog.csdnimg.cn/blog_migrate/7ac29503a67e406b624acef1ba90d012.jpeg)
校验和同理也会有类似的错误:
![577ae8d5317d30bcd7ac05548416db34.png](https://i-blog.csdnimg.cn/blog_migrate/60ed8f48526a513e905000a86e28df28.jpeg)
一个好的校验校验方法,配合数字信号编码方式,如(差分)曼彻斯特编码,(不)归零码等对数据进行编码,可大大提高通信的健壮性和稳定性。例如以太网中使用的是CRC-32校验,曼彻斯特编码方式。本篇文章介绍CRC校验的原理和实现方法。
CRC算法简介
循环冗余校验(Cycli