博客
关于我
自己整理CRC16(表查询法) 笔记(2020.11.2亲测)
阅读量:132 次
发布时间:2019-02-27

本文共 785 字,大约阅读时间需要 2 分钟。

最近,我在学习Modbus协议,尤其是CRC校验部分,对其中的算法有点懵。于是我开始研究CRC计算方法,整理了一些笔记,便于以后查阅。

CRC16算法有两种常用计算方法:直接算法和查表法。

直接算法步骤:

  • 初始化CRC寄存器为FFFF(hex)。
  • 将数据的第一个8-bit字符(高位补0为16位)与CRC寄存器异或,存入寄存器。
  • 右移寄存器一位,移出LSB。
  • 如果LSB为1,寄存器与0xA001异或。
  • 重复步骤3和4,直到8次移位完成。
  • 处理完所有数据后,寄存器的值即为CRC值。
  • 查表法:查表法使用预先生成的表,存储了0~255范围内的CRC值。表格中的数是通过直接算法生成的。具体来说,表格中每个数对应0~255的数据,其CRC值可以通过查表得到。

    表格生成原理:CRC16的生成多项式为x^16 + x^15 + x^2 + 1,对应十六进制0x8005。多项式码0xA001用于调整寄存器。数据传输时,寄存器的最低有效位(LSB)决定是否异或0xA001。

    手动计算实例:以0x02为例,手动计算其CRC值:

  • 寄存器初始值为00000000000010(高八位填充0)。
  • 第一次右移,LSB为0,寄存器变为000000000001。
  • 重复右移,直到8次移位完成,寄存器最终值为0xC181。
  • 从表格中可以看出,s_CRCHi[3]=0x81,s_CRCLo[3]=0xC1。

    Modbus协议CRC实现:代码中,ucCRCHi和ucCRCLo初始化为0x00,逐个处理数据,并更新寄存器值。处理完所有数据后,返回拼接的16位CRC值。

    测试验证:测试数据1和2,结果为0x8051,与预期一致。

    总结:通过手动计算和编程实现,理解了CRC算法的工作原理。虽然直接算法理论基础,但查表法在实际应用中更高效。理解Modbus协议中CRC的传输顺序也是关键实现环节。

    转载地址:http://gcpb.baihongyu.com/

    你可能感兴趣的文章
    OSG学习:WIN10系统下OSG+VS2017编译及运行
    查看>>
    OSG学习:人机交互——普通键盘事件:着火的飞机
    查看>>
    OSG学习:几何体的操作(一)——交互事件、简化几何体
    查看>>
    OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
    查看>>
    OSG学习:几何对象的绘制(一)——四边形
    查看>>
    OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
    查看>>
    OSG学习:几何对象的绘制(二)——简易房屋
    查看>>
    OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
    查看>>
    OSG学习:场景图形管理(一)——视图与相机
    查看>>
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(二)——单窗口多相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>
    OSG学习:纹理映射(一)——多重纹理映射
    查看>>
    OSG学习:纹理映射(七)——聚光灯
    查看>>
    OSG学习:纹理映射(三)——立方图纹理映射
    查看>>
    OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
    查看>>
    OSG学习:纹理映射(五)——计算纹理坐标
    查看>>