1、引言
循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。
而VB语言虽然在开发PC软件中显得有些过时了,但是它简单易于掌握,所以在很多工控产品用任然有大量应用,工控产品应用过程中通常需要进行大量串口通讯,因而不可避免的需要计算CRC校验码,尤其是对于一些非标协议,需要根据协议编写计算CRC校验码的程序。
2、CRC-8计算步骤
(1). CRC寄存器初始值为 0x00。
(2).这里举例的 CRC-8 计算的模型为:X^7+X^6+X^5+X^2+1,得出多项式:0xE5(11100101 B)。
(3). 预置 8 位寄存器为十六进制 0x00(即全为 0) ,称此寄存器为 CRC 寄存器;
(4). 把第一个 8 位数据与 8 位 CRC 寄存器的相异或,把结果放于 CRC 寄存器;
(5). 检测相异或后的CRC寄存器的最高位(第7位),若最高位为1,CRC寄存器先左移1位,再与多项式0x07H进行异或;若为0,则CRC寄存器左移1位,无需与多项式进行异或。
(6). 重复步骤 3 ,直到右移 8 次,这样整个 8 位数据全部进行了处理;
(7). 重复步骤 2 到步骤 4,进行下一个 8 位数据的处理;
(8). 最后得到的 CRC 寄存器即为 CRC 校验码。
3、计算法
Dim CRCFull AS integer //定义CRCFull为整数,用于存储计算过程中的值
Dim CRCLSB AS integer //定义CRCLSB为整数,用于判断计算过程中最高位是否为1
Dim n AS integer //定义n为整数,用于控制计算的循环次数
Dim Str AS string //定义Str为字符串,用于存储需要参与计算的16进制格式的字符串数据,例如:BA430181000202F2
Dim CRC AS string //定义CRC为字符串,用于存储最终计算出的CRC校验
Len=!Len(Str) //取字符串长度,由于类VB语言一般由厂家自行定义函数格式,这里仅为举例,其它的类VB语言可以自行查询手册,对函数进行替换,以下各个函数也是这样。
n=1 //起始位置从1开始
CRCFull=0 //CRC-8初值为0
While(n<=Len) //循环每个字节
i=0
CRCFull=!BitXor(CRCFull,!Hex2I(!mid(Str,n,2))) //CRC值与字符串按位异或,其中!BitXor(x,y)函数为按位异或,x、y为8位整数。!mid(Str,n,2)函数为对字符串Str,从左到右第n位,取2位字符。!Hex2I(x)函数为 把16进制字符串转换为数值。
While(i<8) //循环每个位
CRCLSB=!BitTest(CRCFull,7) //判断最高位是否为1
CRCFull=!BitLShift(CRCFull,1) //左移一位
IF CRCLSB=1 THEN
CRCFull=!BitXor(CRCFull,229) //如果最高位为1,则与多项式X^7+X^6+X^5+X^2+1,即11100101,E5,按位异或
EndIF
i=i+1
Endwhile
n=n+2
Endwhile
CRC=!Prifix(!I2Hex(CRCFull),"00",2) //不足两位补足两位
4、在线CRC校验网址
网址:CRC(循环冗余校验)在线计算_ip33.comCRC(循环冗余校验)在线计算http://www.ip33.com/crc.html