MODBUS的CRC校验过程为:
  1.预置1个16位的寄存器为0xFFFF(即全为1),称此寄存器为CRC寄存器;
  2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与CRC寄存器的低8位相异或,把结果赋值给CRC寄存器;
  3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
  4.如果移出位为0:重复第3步(再次右移一位); 如果移出位为1:CRC寄存器与0xA001(1010 0000 0000 0001)进行异或,结果赋值给CRC寄存器;
  5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
  6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
  7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
  8.最后得到的CRC寄存器内容即为:CRC码。
  之所以有高低位之说,是因为有的程序没有做步骤8,有的程序做了步骤8。
  下面是Java实现的一个CRC校验码生成代码:

private String GetCRC( byte[] frame ) {int CRC = 0x0000ffff;int POLYNOMIAL = 0x0000a001;int i, j;for (i = 0; i < frame.length; i++) {CRC ^= ((int) frame[i] & 0x000000ff);for (j = 0; j < 8; j++) {if ((CRC & 0x00000001) != 0) {CRC >>= 1;CRC ^= POLYNOMIAL;} else {CRC >>= 1;}}}CRC = ( (CRC & 0x0000FF00) >> 8) | ( (CRC & 0x000000FF ) << 8); //转换高低位return Integer.toHexString(CRC);
}

  这是一个在线CRC校验码生成工具,生成的校验码就是没有做步骤8的,需要自己转换一下。

CRC-16/MODBUS的高低位之说相关推荐

  1. Android 蓝牙BLE串口通信之高低位转换、16进制字符串转换float浮点型

    蓝牙技术的普及与发展,为传统设备提供了一种低成本无线通信的方式.串口作为一种使用广泛的通信接口,通过串口转蓝牙,进行无线通信传输的需求逐渐展现出来. 蓝牙串口模块是嵌入式设备上的常用模块,它可以方便地 ...

  2. BYTE,WORD,DWORD的大小及一些特殊的高低位宏(取高位 取低位)

    一.定义 在VC6.0的Microsoft Visual Studio/VC98/Include/windef.h 里,定义了BYTE,WORD,DWORD typedef unsigned long ...

  3. ConcurrentHashMap的源码分析-为什么要做高低位的划分

    要想了解这么设计的目的,我们需要从ConcurrentHashMap的根据下标获取对象的算法来看,在putVal方法中1018行 (f = tabAt(tab, i = (n - 1) & h ...

  4. ConcurrentHashMap的源码分析-高低位原理分析

    ConcurrentHashMap在做链表迁移时,会用高低位来实现,这里有两个问题要分析一下 1. 如何实现高低位链表的区分 假如我们有这样一个队列 第14个槽位插入新节点之后,链表元素个数已经达到了 ...

  5. 洛谷——P1100 高低位交换

    P1100 高低位交换 题目描述 给出一个小于2^32的正整数.这个数可以用一个32位的二进制数表示(不足32位用0补足).我们称这个二进制数的前16位为"高位",后16位为&qu ...

  6. 台达PLC中的寄存器如何进行高低位调换?

    台达PLC中的寄存器如何进行高低位调换? 本文以台达EH3系列PLC进行MODBUS RTU通讯为例,介绍台达PLC中的DTM指令和DXCH指令的具体使用方法. 我们先来看下官方给的MODBUS RT ...

  7. java. int 高低位读取写,数字高位和低位,数据高低位

    内容导航: Q1:计算机知识,什么是高位和低位? 字是两个字节,也就是16个零或一组成的,例如0000 0000 0000 0000,这十六个位置中前八个就是高位,后八个是低位.内存是按字节存放的,而 ...

  8. JAVA int类型 获取高低位

    去年笔者和一个硬件厂商调试打印机的时候遇到这个一个问题,厂商需要打印报文中传输报文的长度标志,按大端序,将长度的高位和低位放到两个字节里,笔者由于基础知识不牢固,在这个问题上浪费了较长时间,今年开始写 ...

  9. 记一次 python 截取高低位(>> 和 运算符)

    记一次 python 截取高低位(>> 和 & 运算符) . 首先我们要知道低字节和高字节:(左高右低) 在编程语言中,字符一般是占 16 位,8 位为一字节,所以有高位字节和低位 ...

最新文章

  1. Java切面理解_Spring AOP面向切面编程:理解篇
  2. python两个集合的交集 合集 差集
  3. 构建器模式:适用于代码,适用于测试
  4. 英语口语 Week15 TuesDay
  5. 贪心算法——洛谷(P1090)[NOIP2004]合并果子
  6. 影响 5000 万开发者,GitHub 与 CSDN 掌舵人对话技术社区未来
  7. [JOYOI1326] 剑人合一
  8. 安装mysql2005出错_SQL Server 2005 安装遇到的错误提示和解决方法
  9. uni-app打开淘宝、京东,并跳转到对应的商品链接
  10. PLM Agile 随笔
  11. 几万年前,孙悟空大闹地府后删库跑路了!那阎王生死簿又该怎么写呢?
  12. GM300写频软件的使用
  13. 物联网之MQTT3.1.1和MQTT5协议 (4) PUBLISH报文
  14. 【转】售前的成长故事(19篇)
  15. 算法设计与分析——第五章回溯法 批处理作业调度 + 最大团问题+图的m着色问题
  16. linux 命令行 英语词典
  17. 【C#教程14/16】:命名空间
  18. 汇编指令学习(CMP,TEST)
  19. 【51nod1326】遥远的旅途
  20. ZigBee协调器向子节点发消息

热门文章

  1. 到微软下载VS2008
  2. Lumaqq移植到Android 之进阶篇
  3. webpack加载css样式 ----css相关loader
  4. 解决问题:Oracle存储过程执行成功,但数据没有变化
  5. 湍流——湍流积分长度
  6. 具有连续调制光栅区域的光波导优化
  7. LUN、ThickLUN与Thin LUN的联系和区别
  8. css html 鼠标手型,鼠标形状,鼠标效果,样式
  9. CF1555D Say No to Palindromes题解--zhengjun
  10. Leetcode——507. Perfect Number