当前位置: 首页 > news >正文

基于MODBUS 协议的CRC16程序实现

基于MODBUS 协议的CRC16程序实现

    ModBus 通信协议的 CRC ( 冗余循环校验码含2个字节, 即 16 位二进制数。CRC 码由发送设备计算, 放置于所发送信息帧的尾部。接收信息设备再重新计算所接收信息 (除 CRC 之外的部分)的 CRC, 比较计算得到的 CRC 是否与接收到CRC相符, 如果两者不相符, 则认为数据出错。

1) 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器。
2) 把第一个 8 位二进制数据 (通信信息帧的第一个字节) 与 16 位的 CRC寄存器的低 8 位相异或, 把结果放于 CRC寄存器。
3) 把 CRC 寄存器的内容右移一位( 朝低位)用 0 填补最高位, 并检查右移后的移出位。
4) 如果移出位为 0, 重复第 3 步 ( 再次右移一位); 如果移出位为 1, CRC 寄存器与多项式A001 ( 1010 0000 0000 0001) 进行异或。
5) 重复步骤 3 和步骤 4, 直到右移 8 次,这样整个8位数据全部进行了处理。
6) 重复步骤 2 到步骤 5, 进行通信信息帧下一个字节的处理。
7) 将该通信信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换。
8) 最后得到的 CRC寄存器内容即为 CRC码。

Modbus CRC编码的程序代码:

1、VB.NET代码

    Private Function Get_CRC16(ByVal Crc16_num As Byte(), ByVal nLength As Byte) As UShort
        Dim i, j As UShort
        Dim crc As UShort
        crc = &HFFFF
        For i = 0 To nLength - 1 Step 1
            crc = crc Xor Crc16_num(i)
            For j = 0 To 7 Step 1
                If (crc And &H1) > 0 Then
                    crc = crc >> 1
                    crc = crc Xor &HA001
                Else
                    crc = crc >> 1
                End If
            Next j
        Next i
        Return crc
    End Function

2、c语言代码

unsigned int CRC16 ( uchar *arr_buff, uchar len)
{

 uint crc=0xFFFF;
 uchar i, j, Data;
 for ( j=0; j
 {

   crc=crc ^*arr_buff++;
   for ( i=0; i<8; i++)
  {

       if( ( crc&0x0001) >0)

       {

           crc=crc>>1;

           crc=crc^ 0xa001;

        }
      else

          crc=crc>>1;
   }
 }
return ( crc);

}

转载于:https://www.cnblogs.com/jungle1989/p/6372527.html

相关文章:

  • python中的logging模块的使用
  • NLPIR大数据挖掘平台新增敏感词扫描功能
  • 面试(二)
  • 第六课、窗口组件及窗口类型------------------狄泰软件学院
  • Git:常用操作
  • Xen server虚拟化中虚拟机磁盘文件丢失的处理办法
  • C语言截取字符串或反转字符串
  • 彻底搞定C指针-函数名与函数指针【转】
  • Spark上的深度学习框架再添新兵:Yahoo开源TensorFlowOnSpark
  • CSS小知识点-1
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • 快速理解 session/token/cookie 认证方式
  • Pivot Table系列之展开/折叠用法 (Expand/Collapse)
  • hadoop 中什么是slots
  • 构建NCBI本地BLAST数据库 (NR NT等) | blastx/diamond使用方法 | blast构建索引 | makeblastdb...
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Koa2 之文件上传下载
  • MobX
  • PHP 7 修改了什么呢 -- 2
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Redis中的lru算法实现
  • SQLServer插入数据
  • webpack+react项目初体验——记录我的webpack环境配置
  • 复习Javascript专题(四):js中的深浅拷贝
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于axios的vue插件,让http请求更简单
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 算法之不定期更新(一)(2018-04-12)
  • 温故知新之javascript面向对象
  • 小程序测试方案初探
  • 优秀架构师必须掌握的架构思维
  • 怎么把视频里的音乐提取出来
  • 智能合约Solidity教程-事件和日志(一)
  • 2017年360最后一道编程题
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​configparser --- 配置文件解析器​
  • #14vue3生成表单并跳转到外部地址的方式
  • (11)MATLAB PCA+SVM 人脸识别
  • (3)STL算法之搜索
  • (笔试题)分解质因式
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (初研) Sentence-embedding fine-tune notebook
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十三)Flask之特殊装饰器详解
  • (万字长文)Spring的核心知识尽揽其中
  • (一)UDP基本编程步骤
  • (已解决)什么是vue导航守卫
  • (转)Android学习笔记 --- android任务栈和启动模式
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • *2 echo、printf、mkdir命令的应用
  • ./和../以及/和~之间的区别