-
-
-
dingxiubing | 当前状态:在线
总积分:8127 2024年可用积分:0
注册时间: 2006-07-13
最后登录时间: 2020-12-10
-
dingxiubing 发表于 2008/12/2 16:24:31
引用 dingxiubing 2008/12/2 16:24:31 发表于2楼的内容
-
-
引用 yk_wangyu 2008/12/3 8:50:48 发表于3楼的内容
-
-
-
dingxiubing | 当前状态:在线
总积分:8127 2024年可用积分:0
注册时间: 2006-07-13
最后登录时间: 2020-12-10
-
dingxiubing 发表于 2008/12/3 9:07:35
引用 dingxiubing 2008/12/3 9:07:35 发表于4楼的内容
-
-
引用 yk_wangyu 2008/12/3 9:26:40 发表于5楼的内容
-
引用 yk_wangyu 2008/12/3 11:48:56 发表于6楼的内容
-
-
-
dingxiubing | 当前状态:在线
总积分:8127 2024年可用积分:0
注册时间: 2006-07-13
最后登录时间: 2020-12-10
-
dingxiubing 发表于 2008/12/3 11:51:57
我用labview和plc分别做过modbus通讯,都不是自己写的校验码。7楼 回复本楼
引用 dingxiubing 2008/12/3 11:51:57 发表于7楼的内容
-
-
引用 yk_wangyu 2008/12/3 12:25:41 发表于8楼的内容
-
-
-
liwenqun_sias | 当前状态:离线
总积分:3983 2024年可用积分:0
注册时间: 2008-09-09
最后登录时间: 2009-11-09
-
liwenqun_sias 发表于 2008/12/3 14:07:48
对于不同的校验方式,其多项式是固定的
工业中常用16位的CRC 以太网用32位crc
一下为网络搜索结果
下面以最常用的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循环冗余校验标准多项式如下:
CRC(16位) = X16+X15+X2+1
CRC(CCITT) = X16+X12 +X5+1
CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1
以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。
注意:这儿列出的标准校验多项式都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。
(注:对二取模的四则运算指参与运算的两个二进制数各位之间凡涉及加减运算时均进行XOR异或运算,即:1 XOR 1=0,0 XOR 0=0,1 XOR 0=1)
引用 liwenqun_sias 2008/12/3 14:07:48 发表于9楼的内容
-
-
引用 yk_wangyu 2008/12/3 21:30:46 发表于10楼的内容
-
-
yk_wangyu 发表于 2008/12/4 11:42:07
第5步里说,共需右移8次,即8位数据全部移出,如果我在第4步中由于LSB中有一位0,重复第3步,多一次右移,那对于第5步来说应该仍然移8次,还是加上低位中有0的那次即移动9次?
引用 yk_wangyu 2008/12/4 11:42:07 发表于11楼的内容