CRC(循环冗余校验)在线计算 http://www.ip33.com/crc.html

里面的8005的多项式值,但网上看到的算法都是用A001来异或的

-----------------------------------------------------

0x8005=1000 0000 0000 0101B 

0xA001=1010 0000 0000 0001B

对比两个二进制高低位正好是完全相反的,CRC校验分为正向校验与反向校验。正向校验高位在左,反向校验低位在左

正向校验使用左移位,反向校验使用右移位

  1. ---------------------------------

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对应的算法

  1. Public Function CRC16(Data() As Byte, ByRef bLow As Byte, ByRef bHigh As Byte) As String
  2.  
  3. Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
  4. Dim CL As Byte, ch As Byte '多项式码&HA001
  5. Dim SaveHi As Byte, SaveLo As Byte
  6. Dim i As Integer
  7. Dim flag As Integer
  8. CRC16Lo = &HFF
  9. CRC16Hi = &HFF
  10. CL =
  11. ch = &HA0
  12.  
  13. For i = LBound(Data) To UBound(Data) -
  14. CRC16Lo = CRC16Lo Xor Data(i) '每一个数据与CRC寄存器的低8位进行异或
  15. '右移8
  16. For flag = To
  17. '记录一下,用来判断移出位是0还是1
  18. SaveHi = CRC16Hi
  19. SaveLo = CRC16Lo
  20.  
  21. CRC16Hi = CRC16Hi \ '高位右移一位
  22. CRC16Lo = CRC16Lo \ '低位右移一位
  23.  
  24. If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1
  25. CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
  26. End If '否则自动补0
  27.  
  28. If ((SaveLo And &H1) = &H1) Then '如果移出位为1,则与多项式码进行异或
  29. CRC16Hi = CRC16Hi Xor ch
  30. CRC16Lo = CRC16Lo Xor CL
  31. End If
  32. Next flag
  33. Next i
  34. Dim ReturnData() As Byte
  35. ReturnData() = CRC16Hi 'CRC高位
  36. ReturnData() = CRC16Lo 'CRC低位
  37. Dim Value As Double
  38. Value = CLng(CRC16Hi * ) + CRC16Lo
  39. CRC16 = ReturnData
  40. bHigh = CRC16Hi
  41. bLow = CRC16Lo
  42.  
  43. End Function

C# 对应的算法

  1. public static byte[] CRC16(byte[] data)
  2. {
  3. int len = data.Length;
  4. if (len > )
  5. {
  6. ushort crc = 0xFFFF;
  7.  
  8. for (int i = ; i < len; i++)
  9. {
  10. crc = (ushort)(crc ^ (data[i]));
  11. for (int j = ; j < ; j++)
  12. {
  13. crc = (crc & ) != ? (ushort)((crc >> ) ^ 0xA001) : (ushort)(crc >> );
  14. }
  15. System.Diagnostics.Debug.WriteLine("i=" + i.ToString() + ","+ crc.ToString());
  16. }
  17. byte hi = (byte)((crc & 0xFF00) >> ); //高位置
  18. byte lo = (byte)(crc & 0x00FF); //低位置
  19.  
  20. return new byte[] { hi, lo };
  21. }
  22. return new byte[] { , };
  23. }

Modbus协议 CRC 校验码的更多相关文章

  1. Modbus RTU CRC校验码计算方法

    在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算. CRC计算方法是: 1.  加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2.   ...

  2. CRC校验码原理、实例、手动计算

    目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...

  3. CRC校验码

    循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码.对于一个给定的(N,K)码,可以证明存在一个最高次幂为R的多项式G(x)(R ...

  4. 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    一.奇偶校验码 二.海明校验码 三.CRC校验码   计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的, ...

  5. Delphi Modbus RTU CRC16校验码

    function CheckCrc16(const ABuf; ALen: Integer): Boolean;var uwTemp: WORD; i, j: BYTE; P: PByte;begin ...

  6. STM32 在串口通信时运用MODBUS协议

    最近一个项目用到了MODBUS协议,就学习了一下,这里做一下记录以免后续忘记. 要用到MODBUS肯定要先知道是MOBUS协议,这里呢我们就又要先理解协议的含义了. 所谓的协议是什么?就是互相之间的约 ...

  7. 如何使用Delphi编写Modbus RTU CRC16的校验码

    在工业控制中,Modbus RTU CRC16的校验码用的比较广泛,包括本人富士产品中,PC与伺服电机以及PC与VP系列的变频器的Modbus RTU通讯中都使用到了CRC16.     而对CRC1 ...

  8. 校验码(海明校验,CRC冗余校验,奇偶校验)

    循环冗余校验码 CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书 ...

  9. C#和C实现通过CRC-16 (Modbus)获取CRC值并校验数据(代码)

    文章首发于浩瀚先森博客 CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验.它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差 ...

随机推荐

  1. linux--top工具分析

    top分析工具详解 第一行:10:01:23 当前系统时间126 days, 14:29 系统已经运行了126天14小时29分钟(在这期间没有重启过)2 users 当前有2个用户登录系统   loa ...

  2. Vue移动端报错[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive.

    解决方法如下 项目方案: 在最外侧添加样式操作 .

  3. 在安装完jdk以后,发现javac不能执行

    安装和配置环境变量都按着流程在,但在最后的检验时,发现Java   Java -version 都能运行,唯独Javac 报“不能识别命令”错误信息,下面列出我遇到一个尴尬问题 在path变量里

  4. C++中各种输入函数的用法总结

    1.scanf()函数 原型:int scanf(const char *restrict format,......); 入口参数:第一个参数是格式字符串,它指定了输入的格式,......格式化后的 ...

  5. 忘记IBM服务器的登录IP

    问题描述: 一台服务器安装了winserver2003系统,经过漫长的加电启动,能进入到win2003的登录界面,提示ctrl+alt+del登录界面,但是发现键盘失灵了,无法键入ctrl+alt+d ...

  6. 使用Fiddler模拟弱网测试教程

    一.下载抓包工具Fiddler 官网下载链接:https://www.telerik.com/fiddler 二.设置Fiddler Tools>>Connections  然后修改监听端 ...

  7. 题解:T103180 しろは的军训列队

    题目链接 solution: 按题目随便假设找到了一个x,它的位置的ap,属性bp 看下图 $$$$$$$$$$$$$$$$|||||P &&&&&&& ...

  8. Python paramiko 报错 paramiko.ssh_exception.SSHException: not a valid RSA private key file

    报错的原因是选择的文件不是一个有效的 RSA 密钥文件 现在通过 ssh-keygen 默认生成的密钥文件是新的格式,并非 RSA 格式.打开文件可以看到是以 -----BEGIN OPENSSH P ...

  9. 事件代理/事件委托----点击li弹出对应的下标和内容

    <body> <ul> <li>这是第一行</li> <li>这是第二行</li> <li>这是第三行</li ...

  10. POJ3685Matrix(二分套二分)

    传送门 题目大意:N*N的矩阵,a[i][j]=i*i+100000*i+j*j-100000*j+i*j,求矩阵中第K小. N<=5*10^4 题解: 打个表,发现每一列从上往下单调递增. 在 ...