社区
硬件设计
帖子详情
CRC16校验算法8005和A001的问题
huangzhtao
2013-05-11 07:11:33
CRC16校验算法如果采用CRC16-IBM方法,生成多项式为x^16+x^15+x^2+1,表示为Ox8005,但是网上很多算法是基于0xA001的(也就是0x8005的逆向),请问这是为什么?
还有,能提供下0x8005的查表法计算的算法吗?
...全文
1827
2
打赏
收藏
CRC16校验算法8005和A001的问题
CRC16校验算法如果采用CRC16-IBM方法,生成多项式为x^16+x^15+x^2+1,表示为Ox8005,但是网上很多算法是基于0xA001的(也就是0x8005的逆向),请问这是为什么? 还有,能提供下0x8005的查表法计算的算法吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pltczw
2013-05-17
打赏
举报
回复
初始参数设为0xFFFF试试
jiangzhucao1989
2013-05-13
打赏
举报
回复
楼主问题解决没啊,我也很想知道问题答案,有结果分享下
C#计算
CRC
16
校验
码示例
遇到要做个
CRC
校验
,翻了一堆资料终于看明白了,内有详细注释,不是普通的词典法,是用
算法
计算出来的
CRC
,对于
CRC
16
-CCITT,只需替换公式即可 /*
CRC
16
实现原理 * *
CRC
16
| g(x)=x
16
+x15+x2+1 | 0x1,80,05 | 1,1000,0000,0000,0101 * * 由于在步骤进行了取反,这里也要把公式反过来 * 0x
8005
1000000000000101 * 0x
A001
1010000000000001 * * 1.置
16
位
CRC
寄存器
CRC
Full全为1 * 2.数据message[i]一个字节8位与
CRC
Full异或,结果存在
CRC
Full(作用是取反) * 3.
CRC
Full最低位存在
CRC
LSB,
CRC
Full右移一位(向低位),用0填补最高位 * 4.检查原最低位即
CRC
LSB: * 1:
CRC
Full与多项式0x
A001
异或 * 0:重复步骤 * 5.重复步骤和,直到右移8次,处理完整个message[i]字节 * 6.重复步骤到,进行下一个字节8位数据的处理,直到(message.Length) * 7.最后得到的
CRC
寄存器
CRC
Full即为此数据的
CRC
16
码 * * * */
crc
校验
字节型
算法
(1)预设一个
16
位寄存器,所有数位均为 1(即值为0x FFFF);待测数据组合 0x00 ~ 0x FF ;(2)该
16
位寄存器与待测数据进行“异或”运算,运算结果仍存该
16
位寄存器中 ;(3)将该
16
位寄存器右移一位,用 0 填补最高位 ;(4)检测移出位是 1 还是 0。若是 1,则生成多项式0x
A001
和该寄存器进行“异或”运算。若是 0,则返回步骤(3);(5)重复步骤(3)和(4),直到右移 8 次,这样待测数据的 8 位数据全部进行了处理 ;(6)将得到的
16
位寄存器的高、低字节进行交换,得到的
16
位寄存器内容即为
CRC
-
16
校验
码 ;(7)将待测数据依次设置为 0x00 ~ 0x FF(256 种),按照步骤(2)~(5)各计算一遍,得到的 256 个
CRC
-
16
校验
码组合在一起即为
CRC
-
16
查询表。
labview制作的
crc
16
校验
码生成程序,符合污染气体在线传输国标
crc
16
.vi是遵循
crc
16
-modbus规则,使用0x
8005
(
A001
)作为多项式,初始值为0xFFFF,结果与0x0000异或的图形化编程
算法
;
crc
16
node.vi是遵循
crc
16
-modbus规则,使用0x
8005
(
A001
)作为多项式,初始值为0xFFFF,结果与0x0000异或的公式节点编程
算法
;
crc
16
HJ212-2017.vi是遵循
crc
16
-USB规则,使用0x
8005
(
A001
)作为多项式,初始值为0xFFFF,结果与0xFFFF异或的公式节点编程
算法
; 目前
crc
16
同
crc
16
node采用的是常见主流
算法
,但是污染气体在线数据传输国标HJ212-2017中给出的例子与
crc
16
HJ212-2017采用
算法
的计算结果一致,所以项目中的
crc
校验
算法
均需与
crc
16
HJ212-2017保持一致。 以上均使用直接计
算法
,优点是
算法
与原理完全一样,简单易懂,缺点是运算周期相较于完整
校验
表查表法和部分
校验
表查表法来说比较长,在要求高速通讯环节可能会影响传输速度。不过对于本项目应用场景(待
校验
数据长度、数据发送频率、服务器性能)来说这三种
算法
的时长都不足一个毫秒,所以目前仍采用直接计算方法,如后期需要可改为查表法。
Modbus RTU
CRC
校验
详细步骤
CRC
值怎么计算
RTU 模式采用
CRC
(Cyclical Redundancy Check)侦误值。
CRC
侦误值计算以下列步骤说明: 步骤一:载入一个内容为 FFFFH 之
16
-bits 寄存器,称之为『
CRC
』寄存器。 步骤二:将指令信息的第一个位组与
16
-bits
CRC
寄存器的低位组进行Exclusive OR 运 算,并将结果存回
CRC
寄存器。 步骤三:检查
CRC
寄存器的最低位(LSB),若此位为0,则右移一位;若此位为1, 则
CRC
寄存器值右移一位后,再与
A001
H 进行Exclusive OR 运算。 步骤四:回到步骤三,直到步骤三已被执行过 8 次,才进到步骤五。 步骤五:对指令信息的下一个位组重复步骤二到步骤四,直到所有位组皆完全处理过, 此时
CRC
寄存器的内容即是
CRC
侦误值。 说明:计算出
CRC
侦误值之后,在指令信息中,须先填上
CRC
的低位,再填上
CRC
的高位,请参考以下例子。 例如:从局号为01H 伺服驱动器的0101H 地址读取2 个字(word)。从ADR 至数据数 的最后一位组所算出的
CRC
寄存器的最后内容为3794H,则其指令信息如下所示,须注 意的是94H 于37H 之前传送。
自编的
CRC
16
校验
器及源码
可
校验
Modbus RTU、
CRC
16
美国版
校验
。 可自定义多项式因子默认为
A001
。
硬件设计
6,125
社区成员
11,293
社区内容
发帖
与我相关
我的任务
硬件设计
硬件/嵌入开发 硬件设计
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 硬件设计
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章