CRC-16 / MODBUS :

1)CRC寄存器初始值为 FFFF;即16位全为1;

2)CRC-16 / MODBUS的多项式A001H (1010 0000 0000 0001B) ‘H’表示16进制数,‘B’表示二进制数

计算步骤为:
(1).预置 16 位寄存器为十六进制 FFFF(即全为 1) ,称此寄存器为 CRC 寄存器;
(2).把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,把结果放于 CRC 寄
存器;

(3).检测相异或后的CRC寄存器的最低位,若最低位为1:CRC寄存器先右移1位,再与多项式A001H进行异或;若为0,则CRC寄存器右移1位,无需与多项式进行异或。

(4).重复步骤 3 ,直到右移 8 次,这样整个 8 位数据全部进行了处理;
(5).重复步骤 2 到步骤4,进行下一个 8 位数据的处理;
(6).最后得到的 CRC 寄存器即为 CRC 码。

补充:
多项式产生:
如x16+x12+x5+1
x16表示第16位为1,x5表示第5位为1
(1 << 16) | (1 << 12) | (1 << 5) | (1) = 0x11021
但是CRC16只取低16位,写成16进制数就是 0x1021

// Modbus crc16
unsigned short crc16 ( unsigned char *Array,  unsigned int Len )
{unsigned int  IX, IY, CRC;unsigned char Rcvbuf[2] = { 0 };if ( Len <= 0 )return 0;CRC = 0xFFFF;for ( IX = 0; IX < Len; IX++ )      //需要处理的数据{CRC = CRC ^ ( unsigned int ) ( Array[IX] );for ( IY = 0; IY <= 7; IY++ )  // 处理1个字节{if ( ( CRC & 1 ) != 0 )CRC = ( CRC >> 1 ) ^ 0xA001;elseCRC = CRC >> 1; }}Rcvbuf[0] = ( CRC & 0xff00 ) >> 8;     //高位Rcvbuf[1] = ( CRC & 0x00ff );      //低位CRC  = Rcvbuf[0] << 8;CRC += Rcvbuf[1];return CRC;
}

参考:https://blog.csdn.net/u013625451/article/details/81239572?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default

Modbus crc16校验相关推荐

  1. java版 modbus crc16校验 (已测试成功)_java版 ModBus CRC16校验 (已测试成功)

    ModBus 的Crc16校验 package testCase; public class CRC16M { static final String HEXES = "0123456789 ...

  2. Modbus CRC16校验方法及实现代码

    0.前言 项目中所用到的DI数字开关模块通信方式为串口通信,内置数据校验方式为Modbus CRC16. 这种校验方式第一次遇到,于是百度了一下,找到这篇文章,按照步骤,自己写了下代码,对比了下文中代 ...

  3. python Modbus CRC16 校验计算公式加源码

    使用Python的确能快速的推进项目,特别是做工业控制和自动化控制程序,最近在忙富X康的一个SMT AGV项目,采用了Python直接通过串口,TCP/IP等,与远程IO,485IO等模块通讯并实现调 ...

  4. crc16校验c语言程序源码,CRC16代码(C语言实现)

    Modbus CRC16校验代码 嵌入式系统crc16校验码计算函数记录 /************************************************** * CRC 高位字节值 ...

  5. MODBUS RTU通信协议 CRC16校验

    MODBUS RTU通信协议 CRC16校验 方法1:查表法 方法2:c语言计算法 方法1:查表法 (1) C查表法版本: 特点:速度快,语句少,但表格占用一定的程序空间. *pucFrame 为待校 ...

  6. php实现 crc16 xmode校验,基于Modbus三种CRC16校验方法的性能对比

    [toc] #1.背景介绍 主要应用场景在物联网中,底端设备注册报文的上报,需要对报文的有效载荷(data)进行CRC16的复验,验证与设备端的CRC校验是否相等,如果相等,报文有效,设备上报就会注册 ...

  7. crc16算法php实现,关于实现CRC16校验算法的两个函数

    之前在2017年2月份发布过一个主题,也是关于CRC16的,现在我直接把函数写出来,希望能帮到有需要的朋友.对于在线监测设备数据传输标准来说,CRC16校验算法有基于通用modbus协议的,有基于环保 ...

  8. PHP CRC16 校验码的算法怎么使用

    PHP CRC16 校验码的算法如何使用 最近用到CRC16, 我现在就是要把 010301180001 算出CRC16的校验码,通过其他工具,可以得到 校验码是 05F1 最后完整的代码就是 010 ...

  9. 最详细易懂的CRC-16校验原理(附源程序)

    from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码( ...

最新文章

  1. (0109)iOS开发之CocoaPods Mac App的安装和使用
  2. python版本升级后编译_python学习笔记(7)--python版本升级
  3. I2C原理及应用实例
  4. Web移动应用调试工具——Weinre
  5. 利用python爬虫(part1)--urllib.request模块
  6. 图解机器学习 github_使用Github和Cloudflare建立网站的图解指南
  7. icmp端口_pingtunnel搭建icmp隧道
  8. 如何用c 语言编写贪吃蛇,刚学C语言,想写一个贪吃蛇的代码
  9. 从txt中读入数据到数组中(fscanf)
  10. python单词必背打印_为什么Python要用print打印这个单词?
  11. linux firefox 插件开发教程,火狐(firefox)浏览器插件开发简明教程
  12. JSP javaweb餐厅点餐系统源码(点餐系统)jsp点餐系统网上订餐
  13. 最新支持备案域名后缀列表
  14. 豆瓣电影详情数据爬取
  15. Jquery监听input回车事件
  16. python删除重复单词_Python - 过滤重复的单词
  17. Qt开源作品16-通用无边框拖动拉伸
  18. php正则判断数字和英文,PHP正则匹配中英文、数字及下划线的方法【用户名验证】...
  19. 简单的前后端交互的案例
  20. 智慧城市建设多面手 5G智慧灯杆成为关键桥梁

热门文章

  1. Java保留小数点一位的方法
  2. varnish-cache使用
  3. 2010软考软件设计师冲刺精选【专家压轴模拟•下】
  4. 飞康CEO:敢于向传统的灾备法则说“不”
  5. Overview of ISA and TMG Networking and ISA Networking Case Study (Part 2)
  6. java框架概念_java概念(2)
  7. 不属于python数据类型的是_Python不支持的数据类型有( )。
  8. [摸鱼]cdq分治 学习笔记
  9. 【Flask模板】include标签
  10. 51Nod 1530 稳定方块