关于CRC校验(转)
楼主lysong(平)2003-01-03 18:59:55 在 VC/MFC / 图形处理/算法 提问
VB下如何编写CRC校验程序
随着计算机技术的不断发展,在现代工业中,利用微机进行数据通讯的工业控制应用得也越来越广泛。由于传输距离、现场状况等诸多可能出现的因素影响,计算机与受控设备之间的通讯数据常会发生无法预测的错误。为了防止错误所带来的影响,一般在通讯时采取数据校验的办法,而循环冗余码校验是最常用的校验方法之一。
一、 循环冗余码校验原理
循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。
根据应用环境与习惯的不同,CRC又可分为以下几种标准:
①CRC-12码;
②CRC-16码;
③CRC-CCITT码;
④CRC-32码。
CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。
下面以最常用的CRC-16为例来说明其生成过程。
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。
下面为CRC的计算过程:
1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。
二、 循环冗余码校验程序的编写
明白了CRC校验码的产生过程,编写起程序来就非常容易了。由于Visual Basic的广泛普及以及其在数据通讯中的重要地位,下面就以VB语言来编写CRC的生成程序,其它语言只需稍做修改即可。
编写CRC校验程序有两种办法:一种为计算法,一种为查表法。下面对两种方法分别讨论。
1.计算法
计算法就是依据CRC校验码的产生原理来设计程序。其优点是模块代码少,修改灵活,可移植性好。其缺点为计算量大。为了便于理解,这里假定了三位数据,而多项式码为A001(hex)。
在窗体上放置一命令按钮Command1,并添加如下代码:
Private Sub Command1_Click()
Dim CRC() As Byte
Dim d() As Byte '待传输数据
ReDim d(2) As Byte
d(0) = 123
d(1) = 112
d(2) = 135
CRC = CRC16(d) '调用CRC16计算函数
'CRC(0)为高位
'CRC(1)为低位
End Sub
注意:在数据传输时CRC的低位可能在前,而高位在后。
Function CRC16(data() As Byte) As String
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
Dim CL As Byte, CH As Byte '多项式码&HA001
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim Flag As Integer
CRC16Lo = &HFF
CRC16Hi = &HFF
CL = &H1
CH = &HA0
For i = 0 To UBound(data)
CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或
For Flag = 0 To 7
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1
CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
End If '否则自动补0
If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或
CRC16Hi = CRC16Hi Xor CH
CRC16Lo = CRC16Lo Xor CL
End If
Next Flag
Next i
Dim ReturnData(1) As Byte
ReturnData(0) = CRC16Hi 'CRC高位
ReturnData(1) = CRC16Lo 'CRC低位
CRC16 = ReturnData
End Function
-----------------------------------请教一下,我看不懂为什么-------------------------------------------
下面为CRC的计算过程:
1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。
///------------------------------------------------------------为什么要先给CRC寄存器赋值0x0FFFF,
// -----------------------------------------------------------先传送的字节是高位字节还是低位字节?
如果能详细解释这个算法的过程更好,谢谢大家。
分享到:
相关推荐
下面是关于 CRC 校验的学习笔记,涵盖了基本原理、模二除法、LFSRs 实现和编程实现等方面的内容。 一、基本原理 CRC 校验的原理基于模二除法。设要传输的数据流的多项式为 M(x),CRC 校验的生成多项式为 G(x),...
CRC校验在通信、计算机存储、网络协议等领域有重要应用。 CRC校验的基本原理是,将数据视为一个二进制多项式,并与一个预定义的生成多项式进行模2除法运算。这个生成多项式通常由系统或协议指定,其长度和位数影响...
在给定的标题"CRC校验(含源代码)"中,我们可以推断这是一个关于CRC校验技术的教程或实例,其中包含了源代码,可能是用Delphi编程语言实现的。Delphi是一款基于Object Pascal的集成开发环境,常用于创建桌面应用...
标题"crcjiaoyan.rar_690123456789_CRC 校验_crc_crc校验_校验码"指出,这是一个关于CRC校验的压缩包文件,可能包含CRC校验的理论介绍、实现方法或者相关教程。其中数字"690123456789"可能是某种特定的CRC校验算法的...
CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据通信和存储中的...以上就是关于CRC校验的基本知识,以及在单片机和软件开发中的应用。理解并熟练掌握CRC校验,对于保证数据的准确传输和存储至关重要。
"crc工具"和"crc校验"则明确表示了这是关于CRC校验的相关软件。 总的来说,这个自编的CRC校验验证工具提供了便利的数据校验手段,无论是对于开发者调试程序,还是普通用户确保数据传输的正确性,都是非常有用的。...
在实际应用中,CRC校验有多种实现方式,本文将从标题、描述、标签和部分内容四个方面对CRC校验应用实例进行详细的知识点介绍。 一、标题:CRC校验应用实例 * CRC校验是一种常用的数据校验算法,广泛应用于数据存储...
以下是关于CRC校验和C#实现的详细知识: 1. **CRC原理**: - CRC校验基于二进制多项式除法。数据被看作是一个二进制多项式,校验码是根据这个多项式和一个预定义的生成多项式进行除法运算后得到的余数。 - 生成...
"说明.txt"可能包含关于如何使用CRC计算器及解释MODBUS协议中CRC校验码的详细步骤和注意事项。"bs_out.txt"和"bs_in.txt"可能分别代表的是经过CRC校验的数据输出文件和原始输入文件,它们可以用于测试CRC计算的正确...
S7-200的CRC校验程序正是针对这一需求设计的,它可以帮助用户生成或验证MODBUS通信中的CRC校验码。 CRC的工作原理基于多项式除法,通过对数据进行特定的数学运算来生成一个短的校验码。这个校验码能够检测出数据...
在工业自动化领域,特别是在使用如博图(TIA Portal)这样的西门子PLC编程软件时,CRC校验对于确保数据的完整性和一致性至关重要。博图15版提供了集成的CRC计算功能,这有助于在Modbus通信协议中建立可靠的数据交换...
5. "crc校验原理.pdf":另一份关于CRC校验基础理论的PDF文档,可能与"crc校验原理.doc"有所重叠,但可能提供了不同的视角或更深入的解释。 综合这些文件,我们可以期待获得关于CRC校验的全面知识,包括CRC的基本...
在本项目中,"C# 实现CRC校验算法源码"是一个控制台应用程序,用户可以通过交互式界面输入需要校验的数据,程序会根据预设的CRC校验规则计算并返回校验码。这个程序的核心是CRC计算函数,它通常会使用位操作来实现,...
提到的博客文章《Android开发中使用CRC校验》(http://blog.csdn.net/duanbokan/article/details/51282614)可能提供了更多关于如何在实际项目中使用CRC校验的实例和技巧,建议阅读以深入了解。 通过上述内容,...
200 smart PLC提供的CRC校验测试程序展示了如何利用直接计算法和查表法这两种方法进行CRC校验,并通过比较它们的性能,为实际工程应用提供参考。理解这两种方法的工作原理及其优缺点,能帮助我们在设计和优化PLC程序...
在STM32F107开发板上进行的CRC校验是嵌入式系统中常用的一种错误检测方法,它能确保数据传输或存储的完整性。CRC,即循环冗余校验,通过计算一个简短的固定位数的校验码来检查数据传输或存储过程中可能出现的错误。 ...
另一文件"www.pudn.com.txt"可能是从网站www.pudn.com下载的相关资料或介绍,可能包含更多关于CRC校验的背景知识、应用场景或相关资源链接。 CRC算法的实现主要包括以下几个步骤: 1. 初始化:设置初始CRC寄存器为...
它们是预先计算好的 lookup 表,用于存储_crc校验多项式的系数。这些数组的值是根据 CRC 校验算法的生成多项式计算得出的。 CRC 校验算法的优点 CRC 校验算法有以下几个优点: 1. 高效:CRC 校验算法可以快速地...
标题提及的"三菱FX1N编写的CRC校验程序"是针对三菱FX1N系列PLC的一种实现,目的是在不使用FX3U系列PLC特有的CRC指令的情况下,也能完成相同的数据校验功能。这样的程序设计对那些使用FX1N但需要与采用CRC校验通信...
CRC校验的原理基于多项式除法,其基本思想是将数据看作一个二进制多项式,然后用一个预定义的生成多项式对其进行除法运算,得到的余数即为CRC校验码。 在LabVIEW环境下,实现CRC校验通常涉及以下步骤: 1. **理解...