Modbus RTU CRC校验详细步骤CRC值怎么计算

Modbus RTU CRC校验详细步骤CRC值怎么计算,第1张

CRC计算方法是:

1、 预置1个16位的寄存器为十六进制FFFF(全1),此寄存器为CRC寄存器

2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的低八位相异或,吧结果存放于CRC寄存器。

3、 把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检测右移后的移出位。

4、 如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与多项式A001进行异或。

5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。

6、 重复步骤2和5,进行通讯信息帧下一个字节的处理。

7、 将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换

8、 最后得到的CRC寄存器内容即为:CRC校验码。

CRC:循环冗余校验(Cyclic Redundancy Check, CRC)。

CRC是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

CRC简介:

在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏(出现比特差错,0变为1,或者1变为0),从而接受方接收到错误的数据。

为尽量提高接受方收到数据的正确率,在接收方接收数据之前需要对数据进行差错检测,当且仅当检测的结果为正确时接收方才真正收下数据。检测的方式有多种,常见的有奇偶校验、因特网校验和循环冗余校验等。

扩展资料:

CRC应用场合:

CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。

CRC的全称是循环冗余校验,其特点是:检错能力强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。

因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。下面介绍硬件生成与计算CRC的过程。

参考资料:百度百科---CRC

下面我们以crc-16为例来说明任意长度数据流的crc校验码生成过程。我们采用将数据流分成若干个8bit字符,并由低字节到高字节传送的并行方法来求crc校验码。具体计算过程为:用一个16bit的寄存器来存放crc校验值,且设定其初值为0x0000;将数据流的第一个8bit与16bit的crc寄存器的高字节相异或,并将结果存入crc寄存器高字节;crc寄存器左移一位,最低1bit补零,同时检查移出的最高1bit,若移出的最高1bit为0,则继续按上述过程左移,若最高1bit为1,则将crc寄存器中的值与生成多项式码相异或,结果存入crc寄存器值;继续左移并重复上述处理方法,直到将8bit数据处理完为止,则此时crc寄存器中的值就是第一个8bit数据对应的crc校验码;然后将此时crc寄存器的值作为初值,用同样的处理方法重复上述步骤来处理下一个8bit数据流,直到将所有的8bit字符都处理完后,此刻crc寄存器中的值即为整个数据流对应的crc校验码。

下面示出了其计算过程的流程图:

在用c语言编写crc校验码的实现程序时我们应该注意,生成多项式

对应的十六进制数为0x18005,由于crc寄存器左移过程中,移出的最高位为1时与

相异或,所以与16bit的crc寄存器对应的生成多项式的十六进制数可用0x8005表示。下面给出并行处理8bit数据流的c源程序:

unsigned

short

crc_dsp(unsigned

short

reg,

unsigned

char

data_crc)

//reg为crc寄存器,

data_crc为将要处理的8bit数据流

{

unsigned

short

msb

//crc寄存器将移出的最高1bit

unsigned

short

data

unsigned

short

gx

=

0x8005,

i

=

0

//i为左移次数,

gx为生成多项式

data

=

(unsigned

short)data_crc

data

=

data

<<

8

reg

=

reg

^

data

do

{

msb

=

reg

&

0x8000

reg

=

reg

<<

1

if(msb

==

0x8000)

{

reg

=

reg

^

gx

}

i++

}

while(i

<

8)

return

(reg)

}

以上为处理每一个8bit数据流的子程序,在计算整个数据流的crc校验码时,我们只需将crc_reg的初值置为0x0000,求第一个8bit的crc值,之后,即可将上次求得的crc值和本次将要处理的8bit数据作为函数实参传递给上述子程序的形参进行处理即可,最终返回的reg值便是我们所想得到的整个数据流的crc校验值。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10827725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存