雷竞技注册
技术文章

循环冗余检查(CRC):数字数据中发现甚至纠正错误

2016年12月22日通过罗伯特Keim

本技术简介解释了什么是CRC,以及如何使用它使您的数字通信更健壮。

本技术简介解释了什么是CRC,以及如何使用它使您的数字通信更健壮。

相关信息

世界现在完全依赖于数字数据的存储和传输。飞机、股票市场、安全系统、高压锅——事实是,如果我们不能确保不断流动的、深入浅出的海量1和0的准确性,现代生活将很快陷入混乱。

维护我们的数字数据的完整性涉及两个主要任务。第一,首先要避免错误;这一目标涉及到鼓励可靠传输和接收数字数据的各种工程实践。但是,尽管我们尽了最大的努力,错误还是会发生,这就把我们带到第二个任务:检测错误。如果一个系统可以检测到错误,它也可以通过简单地抛出有问题的数据或请求重复传输来补偿这些错误。

错误检测方法的选择

如果您熟悉UART通信中有时使用的奇偶校验位,那么您对错误检测有所了解。但奇偶校验位是一种相当可怜的错误检测机制;实际上,据我所知,大部分的错误检测方法或多或少的可怜的循环冗余校验(CRC)相比,这显然已成为数字通信的主要接洽一些知名人士(包括USB可以和以太网)使用CRC作为数据传输协议的一部分。

USB数据包的结构。

有效,但不简单

这篇简短的文章不是探讨CRC计算和性能细节的地方,而且,我没有资格对这个主题进行阐述。底线是二进制“多项式”应用于数据流的方式是产生校验和,如果消息中的一个或多个位发生了变化,校验和很可能会发生变化。

这种“多项式”业务仅仅是一种数学上方便的方式,用于引用特定的位序列。例如:

$x^{16}+x^{12}+x^5+1=0001\ 0000\ 0010\ 0001$

这是广泛使用的“CCITT”多项式。它是一个16阶多项式,这意味着对应的二进制数是16位宽,得到的CRC校验和将是16位宽。(注意,最高阶项的系数假定为1,在二进制版本中省略了。)没有出现在数学表达式中的项的系数是二进制0。

使用硬件CRC模块更容易、更有效地检测错误;这个图表,来自EFM8LB1参考手册,在EFM8激光蜜蜂微控制器中传递CRC外设的功能。

两个crc,不是一个

仅为原始消息生成CRC对您没有帮助。实现CRC错误检测的关键是确保发送端和接收端都以完全相同的方式生成校验和。

发送端生成待发送数据的校验和,并将其包含在原始消息中,接收端使用接收到的数据生成自己的校验和。如果接收方的消息与发送方的消息不匹配,则校验和很可能是不同的;因此,如果CRC校验和不匹配,接收方认为数据是错误的。

更进一步

您应该意识到CRC处理实际上可以用于正确的错误,而不仅仅是检测它们。我们这里处理的是二进制数据,所以如果CRC允许我们识别错误位,我们可以通过简单地翻转位来恢复原始信息。

基于crc的错误修正的细节超出了我的知识范围。如果你想要更多的信息,你将不得不在别处继续你的研究,或者希望这个话题很快在AAC的一篇新文章中被涵盖!