MODBUS CRC校验原理及C语言实现

2023-11-17

MODBUS通信协议的CRC校验原理多项式为8005的逆序A001
01CRC校验原理:
1111111111111111                 初始化CRC寄存机
0000000000000001                
1111111111111110                 异或
                                
0111111111111111 0 LSB0        第一次右位移
                                
0011111111111111 1 LSB1        第二次右位移
1010000000000001//8005反序即A001
1001111111111110                 异或
                                
0100111111111111 0 LSB0        第三次右位移
                                
0010011111111111 1 LSB1        第四次右位移
1010000000000001//8005反序即A001
1000011111111110                 异或
                                
0100001111111111 0 LSB0        第五次右位移
                                
0010000111111111 1 LSB1        第六次右位移
1010000000000001//8005反序即A001
1000000111111110                 异或
                                
0100000011111111 0 LSB0        第七次右位移
                                
0010000001111111 1 LSB1        第八次右#在这里输入你想要说的话题# 位移
1010000000000001//8005反序即A001
1000000001111110                     异或的结果807E
CRC多项式种类很多,采用的方法有逆序、..上面这个是多项式8005的逆序算法。

如果代码为0105则用05继续与结果807E做上面八次位移异或即可。有好的算法共同分享哈。

//========================================================================================

ModBus 通信协议的 CRC ( 冗余循环校验码)含2个字节, 即 16 位二进制数。
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编码的程序代码:
unsigned int CRC16 ( uchar *arr_buff, uchar len)
{
 uint crc=0xFFFF;(1)
 uchar i, j, Data;
 for ( j=0; j
 {
   crc=crc ^*arr_buff++;
   for ( i=0; i<8; i++)
  {
       if( ( crc&0x0001) >0)(2)
       {
           crc=crc>>1;
           crc=crc^ 0xa001;
        }
      else
          crc=crc>>1;(3)   }
 }
return ( crc);
}

//========================================================================================

/*计算CRC码的步骤为:
(1).预置16位寄存器为FFFFH。称此寄存器为CRC寄存器;
(2).把第一个8位数据与CRC寄存器的低位相异或,把结果放于CRC寄存器;
(3).把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
(4).如果最低位为0:重复第3步(再次移位)如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6).重复步骤2到步骤5,进行下一个8位数据的处理;
(7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H)
*/
/*****************crc校验**********************************************/
//crc生成函数,并将crc存储在预先定于的数组中
//调用方式crc16(指向数据的指针,需要校验的数据长度)
unsigned char CRC[2];//定义数组
void crc16(unsigned char *ptr,unsigned int len)
{
unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1
unsigned char temp;//定义中间变量
int i=0,j=0;//定义计数
for(i=0;i<len;i++)//循环计算每个数据
{
temp=*ptr&0X00FF;//将八位数据与crc寄存器亦或
ptr++;//指针地址增加,指向下个数据
wcrc^=temp;//将数据存入crc寄存器
for(j=0;j<8;j++)//循环计算数据的
{
if(wcrc&0X0001)//判断右移出的是不是1,如果是1则与多项式进行异或。
{
wcrc>>=1;//先将数据右移一位
wcrc^=0XA001;//与上面的多项式进行异或
}
else//如果不是1,则直接移出
{
wcrc>>=1;//直接移出
}
}
}
temp=wcrc;//crc的值
CRC[0]=wcrc;//crc的低八位
CRC[1]=wcrc>>8;//crc的高八位
}
//===========================================================================================

(1)先选择校验对帧进行除法运算的除数

是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”)。

(2)看所选定的除数二进制位数(k位),

然后在要发送的数据帧(m位)后面加k-1位“0”,(一共是m+k-1位)

以“模2除法”方式除以上面这个除数,

所得到的余数二进制的比特串就是该帧的CRC校验码也称之为FCS(帧校验序列)。

注意,余数的位数一定要比除数只能少一位

(3)再把这个校验码附加在原数据帧后面

最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,

如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。

最高位和最低位必须均为“1”

如在IBM的SDLC(同步数据链路控制)规程中使用的CRC-16(也就是这个除数一共是17位)生成多项式g(x)= x16 + x15 + x2 +1(对应二进制比特串为:1 1000 0000 0000 0101);

而在ISO HDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多项式g(x)= x16 + x15 + x5+1(对应二进制比特串为:1 1000 0000 0010 0001)。

“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可

模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;

模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。

相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。

如100101除以1110,结果得到商为11,余数为1,如图5-9左图所示0

如11×11=101,如图5-9右图所示。

图5-9 “模2除法”和“模2乘法”示例

CRC的生成多项式是P=X3+1代表什么


p(x)=x3+x2+x1+1 对应1111

p(x)=x3+ 1 对应1001

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MODBUS CRC校验原理及C语言实现 的相关文章

  • SPI通讯的数据交互及图片显示

    这个项目耗时三个月 前两个月攻克技术难关 后一个月进行功能联调 也是我很长时间没有更新的原因 一个项目从初期的evt到最终的pvt 离不开大家的合作 从前期的prd核对到最终的项目交付 耗费了我大量心血 期间遇到的问题不计其数 所以说一个好
  • 图解通信原理与案例分析-6:基于离散字符的RS232串口数字通信--收发双方独立预设置同步时钟

    前言 RS 232标准接口是计算机常用的串行通信接口标准之一 虽然比较简单与成熟 但对于理解通信原理的基本流程和框架 核心的概念有基础性帮助作用 本文将从通信原理的角度 解析RS232串口通信过程中的每个环节 包括硬件和软件 在信源和信宿之
  • 基于QT的TCP通信实现(TCPServer和TCPClient)

    文章目录 一 软件介绍 1 1 TCPServer服务端界面 1 2 TCPClient客户端界面 1 3 服务端和客户端建立连接并通信演示 二 QT实现TCPServer和TCPClient 2 1 TCPClient客户端 2 1 TC
  • ESP32使用AT MQTT 固件发布主题信息返回ERROR解决

    目录 发布格式 原因及其解决方法 发布格式 AT MQTTPUB lt topic gt lt data gt 0 0 当需要发布对应主题的json数据包时 错误格式 AT MQTTPUB 0 device date msg1 22 msg
  • 卫星通信的资源调度 vs 地面无线通信的资源调度

    以OFDM系统为例 考虑多个用户共用多个子载波的场景 一 两类资源 调整时频资源 即基站或卫星决定给各个用户在哪些时隙分配多少子载波 调整发射功率 即基站或卫星决定给每个用户在每个子信道上的功率是多大 用字母 P n k P n k Pn
  • SPI&CAN通信协议简介

    目录 1 SPI SPI的四种工作模式 CPOL clock polarity 时钟极性 CPHA clock phase 时钟相位 四种工作模式 2 CAN CAN的特点 物理层特征 通讯节点 CAN通信报文 数据帧介绍 远程帧 错误帧
  • Python实现串口通信(pyserial)

    Python实现串口通信 pyserial pyserial模块封装了对串口的访问 兼容各种平台 安装 pip insatll pyserial 初始化 简单初始化示例 import serial ser serial Serial com
  • VMware 下的CentOS6.7 虚拟机与Windows7通信

    在有网络的情况下 VMware 虚拟机使用桥接模式 Bridged 和NAT方式 会自动通信 但是在没有网络的情况下怎么办呢 对 是的 使用host only模式 如何设置呢 注 将Windows上的虚拟网卡改成跟Linux上的网卡在同一网
  • 优化理论

    版权声明 原创作品 整理不易 转载请标明出处 本篇推送更详细的内容介绍 可参见本人微信公众号 优化与博弈的数学原理 公众号二维码参见文末 或参见以下网址 优化理论 Time Sharing Condition 编者按 OFDM系统中的功率分
  • Redis 学习笔记(十五)Redis Cluster 集群扩容与收缩

    Redis Cluster 集群伸缩 1 伸缩原理 Redis提供了灵活的节点扩容和收缩方案 在不影响集群对外服务的情况下 可以为集群添加节点进行扩容也可以对下线节点进行缩容 我们在Redis Cluster 介绍与搭建这篇文章中搭建了一个
  • Nakagami-m 信道

    Nakagami m 分布是日本学者Nakagami 在1960年的一篇论文中提出的快衰落模型 Nakagami m 的表达式 我们遵照参考文献 1 的说法1 假设接收信号表示如下 r n g
  • [4G/5G/6G专题基础-150]: 6G总体愿景与潜在关键技术白皮书解读-5-缩略语释义

    目录 前言 附录 AI 人工智能 AR 增强现实 Augmented Reality 简称AR DT 数字孪生 MR 混合现实技术 MTP 头动响应 DOICT 数字 运营 信息 通信 FDD 频分双工 FTN 超奈奎斯特准则 IHR 智能
  • 【Android Socket专题】:UDP通信客户端app的demo的实现

    Android Socket 专题 UDP Client客户端 http blog csdn net shankezh article details 50731287 UDP Server服务器 http blog csdn net sh
  • RFID系统信号通信过程

    如图
  • SSL工作原理

    转自 https www wosign com Basic howsslwork htm SSL 是一个安全协议 它提供使用 TCP IP 的通信应用程序间的隐私与完整性 因特网的 超文本传输协议 HTTP 使用 SSL 来实现安全的通信
  • linux笔记之初次接触信号

    一 关于信号概念 1 信号是Linux所使用的进程间通信的最古老的方式 它是在软件层次上对中断机制的一种模拟 是一种异步通信的方式 一个完整的信号周期包括三个部分 信号的产生 信号在进程中的注册 信号在进程中的注销 执行信号处理函数 如下图
  • MODBUS CRC校验原理及C语言实现

    MODBUS通信协议的CRC校验原理多项式为8005的逆序A001 列01的CRC校验原理 1111111111111111 初始化CRC寄存机 0000000000000001 1111111111111110 异或 0111111111
  • http和Tcp的长连接和短连接

    转自 https www cnblogs com fubaizhaizhuren p 7523374 html http协议和tcp ip 协议的关系 1 http是应用层协议 tcp协议是传输层协议 ip协议是网络协议 2 IP协议主要解
  • ZooKeeper系统模型之集群间消息通信。

    ZooKeeper的消息类型大体上可以分为四类 分别是 数据同步型 服务器初始化型 请求处理型和会话管理型 数据同步型 数据同步型消息是指在Learner和Leader服务器进行数据同步的时候 网络通信所用到的消息 通常有DIFF TRUN
  • 自协商功能原理及工作过程

    自协商原理 自协商是通过一种叫做快速连接脉冲 Fast Link Pulse 的信号实现的 简称FLP 自协商的双方通过FLP来交换数据 在具备自协商能力的端口没有Link的情况下 端口一直发送FLP 在FLP中包含着自己的连接能力信息 包

随机推荐

  • Future异步

    Future异步是Java中常用的异步编程方式之一 它能够在代码执行过程中返回一个代表未来结果的Future对象 使得程序能够在等待结果的同时继续执行其他操作 本文将从Future异步的定义 使用方法和优缺点等方面对其进行详细介绍 一 Fu
  • Qt信号发送过快,槽函数处理不过来解决方法

    问题 跨线程使用信号与槽连接 信号的发送时间间隔小于槽函数处理的时间间隔 造成的问题 子线程下的槽函数 用sleep来模拟槽函数的耗时操作 void MyThread myTimeout qDebug lt lt test QThread
  • 矩阵转置代码,速度优化

    今天心血来潮 想写个CPU版本的矩阵转置代码 过几天写GPU版本的 按照我的想法 就是以下几种方式 1 gt 整块矩阵转置 横读纵写或纵读横写 2 gt 将矩阵分成固定大小的block block与block可以分成横读纵写或纵读横写 而b
  • const修饰成员函数

    常函数 成员函数后加const后 我们称这个函数为常函数 在常函数内不可以修改成员的属性 成员属性声明时加关键字mutable后 在常函数中依然可以修改 常对象 声明对象前加const称该对象为常对象 常对象不能在类外修改其成员属性 但可以
  • K8s(Kubernetes)工具

    文章目录 Kubernetes简介 kubernetes背景和历史 kubernetes特点 kubernetes相关概念 基本对象 Pod Service Volume 持久存储卷 Persistent Volume PV 和持久存储卷声
  • linux怎么用python运维命令_运维笔记--linux环境提示python: command not found

    场景描述 新部署的容器环境 终端执行python命令 提示没有该命令 从报错异常可以看出 可能是python环境未安装 分析思路 检查python路径 方式一 type a python 方式二 ls l usr bin python ls
  • 【python总结】python学习框架梳理

    目录 基础 注释与变量名等基本规则 关键字 操作符 数字 流程控制 序列 文本序列 字符串 二进制序列 字节 列表 元组 映射 字典 集合 函数 面向对象编程 错误和异常 模块 数据结构与算法 数组 字符串 链表 二分查找 排序 栈 队列
  • 企业微信回调-通讯录改变回调

    https work weixin qq com api doc 90000 90135 90966 先配置url token encodingAESKey import com ichangtou common util AesExcep
  • Maven环境正常,打包后使用报 java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream 错误

    也是找的网上的解决方法 下载一个tomcat 里面包含着必要的jar包 然后把TOMCAT PATH common lib servlet api jar复制出来 放到 JDK PATH jre lib ext下面 如果不行就重启一下项目
  • 区块链都记录了哪些信息?

    区块如何连接成区块链 之前的文章里又说到区块链 想要知道区块链上的信息首先需要了解一下什么是区块链 区块链其实是一串使用密码学算法产生的区块连接而成 每一个区块上写满了交易记录 区块按顺序相连形成链状结构 就像世界上的电脑一样 电脑每一台电
  • 十四、内置模块path、邂逅Webpack和打包过程、css-loader

    一 内置模块path 1 path介绍 2 path常见的API 这里重点讲一下path resolve 看上面的例子 从右往左开始解析 所以一开始解析的就是 abc txt 这个时候就会把它当成一个绝对路径了 为什么 因为看到斜杠 默认就
  • httpclient工具类

    import java io IOException import java net URI import java util ArrayList import java util List import java util Map imp
  • Channel-wise Knowledge Distillation for Dense Prediction阅读笔记

    Channel wise KD阅读笔记 一 Title 二 Summary 三 Research Object 四 Problem Statement 五 Method 5 1 spatial distillation 5 2 Channe
  • macOS使用 之 读写NTFS格式磁盘

    因为版权问题 macOS并没有开放是支持Windows NTFS 格式硬盘的写入操作 因此对MAC用户使用移动磁盘造成了极大的困扰 下面楼主就来介绍一下mac系统中读取NTFS格式的简单办法 1 使用常见付费软件 如果你土豪级别的人物 不在
  • CHROME扩展开发之·消息传递Message(window.message)

    由于content scripts运行在Web页面的上下文中 属于Web页面的组成部分 而不是Google Chrome扩展程序 但是content scripts又往往需要与Google Chrome扩展程序的其他部分通信以共享数据 这可
  • 小红书流量逻辑、KOL模型、内容营销

    小红书平台专项课 品牌营销训练营 融合了千瓜历年研究和整理的成果 结合实际案例给到大家最全最干货的内容 本文选取了课程中的精华部分 为大家提供一份历年品牌营销投放的实操总结 助力2022年品牌营销增长 从消费者层级到消费者决策 从品牌内容营
  • 【Transformer学习笔记】VIT解析

    很久以前科学家做过一个生物实验 发现视觉神经元同样可以被训练来作听觉神经元之用 受此启发 不少计算机研究者也在寻找着机器学习领域的大一统 将CV任务和NLP任务使用相同或者类似的结构进行建模 随着transformer在nlp领域已经杀出了
  • 微信小程序使用本地图片在真机预览不显示的问题解决

    开发工具上本地图片可以显示 但是在真机上预览的时候不能显示 通常我们代码路径是代码是这样写的
  • 什么是 Python?Python 基础编程入门指南,带你从零开始深入了解

    Python是当今最流行的编程语言之一 Python以其简单的语法和多功能性而闻名 既易于学习又可用于高级应用程序 可以使用Python的领域也非常广泛 人工智能 机器学习 Web 开发 基本上绝大多数热门的域都能看到Python的身影 今
  • MODBUS CRC校验原理及C语言实现

    MODBUS通信协议的CRC校验原理多项式为8005的逆序A001 列01的CRC校验原理 1111111111111111 初始化CRC寄存机 0000000000000001 1111111111111110 异或 0111111111