Modbus协议 CRC 校验码
CRC(循环冗余校验)在线计算 http://www.ip33.com/crc.html
里面的8005的多项式值,但网上看到的算法都是用A001来异或的
-----------------------------------------------------
0x8005=1000 0000 0000 0101B
0xA001=1010 0000 0000 0001B
对比两个二进制高低位正好是完全相反的,CRC校验分为正向校验与反向校验。正向校验高位在左,反向校验低位在左
正向校验使用左移位,反向校验使用右移位
- ---------------------------------
Modbus协议,常规485通讯的信息发送形式如下:
地址 功能码 数据信息 校验码
1byte 1byte nbyte 2byte
CRC校验是前面几段数据内容的校验值,为一个16位数据,发送时,低8位在前,高8为最后。
例如:信息字段代码为: 1011001,校验字段为:1010。
发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10
参考文档:
https://www.jianshu.com/p/676744381473
https://www.jianshu.com/p/c0d93c2e89ce
VB对应的算法
- Public Function CRC16(Data() As Byte, ByRef bLow As Byte, ByRef bHigh As Byte) As String
- Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
- Dim CL As Byte, ch As Byte '多项式码&HA001
- Dim SaveHi As Byte, SaveLo As Byte
- Dim i As Integer
- Dim flag As Integer
- CRC16Lo = &HFF
- CRC16Hi = &HFF
- CL =
- ch = &HA0
- For i = LBound(Data) To UBound(Data) -
- CRC16Lo = CRC16Lo Xor Data(i) '每一个数据与CRC寄存器的低8位进行异或
- '右移8次
- For flag = To
- '记录一下,用来判断移出位是0还是1
- SaveHi = CRC16Hi
- SaveLo = CRC16Lo
- CRC16Hi = CRC16Hi \ '高位右移一位
- CRC16Lo = CRC16Lo \ '低位右移一位
- If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1
- CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
- End If '否则自动补0
- If ((SaveLo And &H1) = &H1) Then '如果移出位为1,则与多项式码进行异或
- CRC16Hi = CRC16Hi Xor ch
- CRC16Lo = CRC16Lo Xor CL
- End If
- Next flag
- Next i
- Dim ReturnData() As Byte
- ReturnData() = CRC16Hi 'CRC高位
- ReturnData() = CRC16Lo 'CRC低位
- Dim Value As Double
- Value = CLng(CRC16Hi * ) + CRC16Lo
- CRC16 = ReturnData
- bHigh = CRC16Hi
- bLow = CRC16Lo
- End Function
C# 对应的算法
- public static byte[] CRC16(byte[] data)
- {
- int len = data.Length;
- if (len > )
- {
- ushort crc = 0xFFFF;
- for (int i = ; i < len; i++)
- {
- crc = (ushort)(crc ^ (data[i]));
- for (int j = ; j < ; j++)
- {
- crc = (crc & ) != ? (ushort)((crc >> ) ^ 0xA001) : (ushort)(crc >> );
- }
- System.Diagnostics.Debug.WriteLine("i=" + i.ToString() + ","+ crc.ToString());
- }
- byte hi = (byte)((crc & 0xFF00) >> ); //高位置
- byte lo = (byte)(crc & 0x00FF); //低位置
- return new byte[] { hi, lo };
- }
- return new byte[] { , };
- }
Modbus协议 CRC 校验码的更多相关文章
- Modbus RTU CRC校验码计算方法
在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算. CRC计算方法是: 1. 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2. ...
- CRC校验码原理、实例、手动计算
目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...
- CRC校验码
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码.对于一个给定的(N,K)码,可以证明存在一个最高次幂为R的多项式G(x)(R ...
- 常用校验码(奇偶校验码、海明校验码、CRC校验码)
一.奇偶校验码 二.海明校验码 三.CRC校验码 计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的, ...
- Delphi Modbus RTU CRC16校验码
function CheckCrc16(const ABuf; ALen: Integer): Boolean;var uwTemp: WORD; i, j: BYTE; P: PByte;begin ...
- STM32 在串口通信时运用MODBUS协议
最近一个项目用到了MODBUS协议,就学习了一下,这里做一下记录以免后续忘记. 要用到MODBUS肯定要先知道是MOBUS协议,这里呢我们就又要先理解协议的含义了. 所谓的协议是什么?就是互相之间的约 ...
- 如何使用Delphi编写Modbus RTU CRC16的校验码
在工业控制中,Modbus RTU CRC16的校验码用的比较广泛,包括本人富士产品中,PC与伺服电机以及PC与VP系列的变频器的Modbus RTU通讯中都使用到了CRC16. 而对CRC1 ...
- 校验码(海明校验,CRC冗余校验,奇偶校验)
循环冗余校验码 CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书 ...
- C#和C实现通过CRC-16 (Modbus)获取CRC值并校验数据(代码)
文章首发于浩瀚先森博客 CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验.它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差 ...
随机推荐
- linux--top工具分析
top分析工具详解 第一行:10:01:23 当前系统时间126 days, 14:29 系统已经运行了126天14小时29分钟(在这期间没有重启过)2 users 当前有2个用户登录系统 loa ...
- Vue移动端报错[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive.
解决方法如下 项目方案: 在最外侧添加样式操作 .
- 在安装完jdk以后,发现javac不能执行
安装和配置环境变量都按着流程在,但在最后的检验时,发现Java Java -version 都能运行,唯独Javac 报“不能识别命令”错误信息,下面列出我遇到一个尴尬问题 在path变量里
- C++中各种输入函数的用法总结
1.scanf()函数 原型:int scanf(const char *restrict format,......); 入口参数:第一个参数是格式字符串,它指定了输入的格式,......格式化后的 ...
- 忘记IBM服务器的登录IP
问题描述: 一台服务器安装了winserver2003系统,经过漫长的加电启动,能进入到win2003的登录界面,提示ctrl+alt+del登录界面,但是发现键盘失灵了,无法键入ctrl+alt+d ...
- 使用Fiddler模拟弱网测试教程
一.下载抓包工具Fiddler 官网下载链接:https://www.telerik.com/fiddler 二.设置Fiddler Tools>>Connections 然后修改监听端 ...
- 题解:T103180 しろは的军训列队
题目链接 solution: 按题目随便假设找到了一个x,它的位置的ap,属性bp 看下图 $$$$$$$$$$$$$$$$|||||P &&&&&&& ...
- Python paramiko 报错 paramiko.ssh_exception.SSHException: not a valid RSA private key file
报错的原因是选择的文件不是一个有效的 RSA 密钥文件 现在通过 ssh-keygen 默认生成的密钥文件是新的格式,并非 RSA 格式.打开文件可以看到是以 -----BEGIN OPENSSH P ...
- 事件代理/事件委托----点击li弹出对应的下标和内容
<body> <ul> <li>这是第一行</li> <li>这是第二行</li> <li>这是第三行</li ...
- POJ3685Matrix(二分套二分)
传送门 题目大意:N*N的矩阵,a[i][j]=i*i+100000*i+j*j-100000*j+i*j,求矩阵中第K小. N<=5*10^4 题解: 打个表,发现每一列从上往下单调递增. 在 ...