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

嵌入式 STM32 通讯协议--MODBUS

目录

一、自定义通信协议

1、协议介绍

2、网络协议

3、自定义的通信协议 

二、MODBUS通信协议

1、概述

2、MODBUS帧结构 

协议描述

3、MODBUS数据模型  

4、MODBUS事务处理的定义

5、MODBUS功能码 

6、功能码定义 

 7、MODBUS数据链路层

8、MODBUS地址规则 

9、MODBUS帧描述

10、MODBUS两种串行传输模式 

11、MODBUS主机实现


一、自定义通信协议

1、协议介绍

什么是协议??

协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议(protocol),它最终体现为在网络上传输的数据包的格式。

串口,STM32 跟电脑通信,双方的波特率必须是一样的才能够通信。----这也是一种协议。

2、网络协议

网络七层协议--TCP--

3、自定义的通信协议 

自己定义的一种协议。随便定义 ----即使是自定义的协议,一般也遵循一般协议的格式。

协议有什么格式?

通信中的数据往往以数据包的形式进行传送,我们把这样的一个数据包称为一帧数据。类似于网络通信中的TCPIP协议一样,比较靠谱的通信协议往往都是含有一下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。

RS485 发送hello . 如果以数据帧格式发送hello. 怎么样写???

帧头:  一帧数据开始,可以使用多个字节。 假如以一个字节:0XFF  ----自己定义。

地址信息:跟哪个设备进行通信(类型于IIC器件地址) ---0X01  0X02  芯片ID

数据类型:如 0x01 –代表发的是字符。 0x02 –代表16进制   ---- 类似命令

数据长度: ---  如果发送的数据大于256个字节,至少用2个字节表示  0x00 0x05

数据块 :数据,发送的数据

校验码 :求和,CRC16, CRC8,

帧尾 : 一帧数据结束,可以使用多个字节。 假如以一个字节:0XFE  ----自己定义。

二、MODBUS通信协议

参考资料

1、概述

串行链路上的 MODBUS
MODBUS 串行链路取决于 TIA/EIA 标准:232-F 485-A

 

MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备

之间提供客户机/服务器通信。

MODBUS 是一个请求/应答协议,并且提供功能码规定的服务。MODBUS 功能码是 MODBUS

请求/应答 PDU 的元素。

主机发起问答数据包,从机回复应答数据包,从机不能主动发起通信。

2、MODBUS帧结构 

协议描述

 

MODBUS数据帧包含了:地址域、功能码、数据域、校验 四部分 。

功能码向服务器指示将执行哪种操作。

 

3、MODBUS数据模型  

 

数据模型看成功能码类型:Modbus一共有四种模式:

散量输入个比特(个位) ,只读。MCU用在读一个位的状态。读取一个IO口的电平状态

理解 STM32    GPIOX->IDR  & 1<<0 ; 如果我们STM32 IO口的电平状态,那么 我们就可以把这个功能码设置为散量输入 。智能节点板上些功能可以使散量输入?(取按键状态、读取LED状态,读取继电器开关等待)。

线圈个比特(个位) ,可MCU用在读写一个位的状态。读取或者写一个IO口的电平状态GPIOX->ODR |= 1<<0 ; GPIOX->ODR |= 1<<1;如果我们写STM32 IO口的电平状态,那么 我们就可以把这个功能码设置为线 。智能节点板上些功能可以使线?(或者关LED关继电器。

输入寄存器16比特字(16位只读。MCU用在读(多)个位的状态。读取六个IO口的电平状态 u16 temp = GPIOX->IDR ; 在智能节点板上些功能可以使输入寄存器(读取温湿度—

temp=get();取光强度、MP2.5  、空气质量

保持寄存器16比特字(16位,可MCU用在读(多)个位的状态。读取六个IO口的电平状态 u16 temp = GPIOX->IDR ;(OLED

4、MODBUS事务处理的定义

5、MODBUS功能码 

有三类 MODBUS 功能码:有效的码字范围是十进制 1-255(128-255 为

异常响应保留)

公共功能码

二类:用户定义功能码

三类:保留功能码

6、功能码定义 

 

读输入离散量 – 0x02

功能 :读一个位的状态。

PDU: 协议数据单元,包含MODBUS数据帧的功能码和数据

 功能码:0x02   占一字节。

起始地址:0x0000至0Xffff,占两字节,如写 0x1234

输入数量:需要读取的数量,最大可以读取2000个位。如写0x08 (相当于读8个位的状态。这8 个位可以是不连续)。

 功能码:0x82  占一字节。

节数:需要个字节来存放你读取的状态。读取8个位,字节数0x01 。如读取9位,字节数0x02   à N=输出数量/8,如果余数不等于 0,那么N = N+1

输入状态 :u8 temp;  temp = read() ;  0xab 表示读取的8个位的状态

 

 

将离散量输入状态 204-197 表示为十六进制字节值 AC,或二进制 1010 1100。输入 204 是这个字节的 MSB,输入 197 是这个字节的 LSB。

将离散量输入状态 218-213 表示为十六进制字节值 35,或二进制 0011 0101。输入 218 位于左侧第 3 比特,输入 213 是 LSB。

注:用零填充 2 个剩余比特(一直到高位端)。

读线圈 –0x01

读输入寄存器--0x04

 

 7、MODBUS数据链路层

 

主节点以两种模式对子节点发出 Modbus 请求:

 1. 在单播模式,主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个 '应答')。在这种模式, 一个 Modbus 事务处理包含 2 个报文: 一个来自主节点的请求, 一个来自子节点的应答。每个子节点必须有唯一的地址 (1 到 247),这样才能区别于其它节点被独立的寻址

 2. 在广播模式,主节点向所有的子节点发送请求。对于主节点广播的请求没有应答返回。 广播请求一般用于写命令。所有设备必须接受广播模式的写功能。地址 0 是专门用于表示广播数据的

8、MODBUS地址规则 

 地址 0 保留为广播地址。 所有的子节点必须识别广播地址。

Modbus 主节点没有地址, 只有子节点必须有一个地址。 该地址必须在 Modbus 串行总线上唯一。

9、MODBUS帧描述

10、MODBUS两种串行传输模式 

有两种串行传输模式被定义: RTU 模式 和 ASCII 模式。

它定义了报文域的位内容在线路上串行的传送。它确定了信息如何打包为报文和解码。

Modbus 串行链路上所有设备的传输模式 (和串行口参数) 必须相同。

尽管在特定的领域 ASCII 模式是要求的,但达到 Modbus 设备之间的互操作性只有每个设备都有相同的模式: 所有设备必须必须实现 RTU 模式。 ASCII 传输模式是选项。

设备应该由用户设成期望的模式, RTU 或 ASCII。 默认设置必须为 RTU 模式

  • RTU ---常用的。

 Modbus RTU 帧最大为 256 字节。

没有帧头,也没有帧尾。没有帧尾,怎么知道一帧数据结束????

之前485怎么判断发送一次数据结束??使用定显示器。发送两次数据之间时间间隔不超过10ms.

 图可知,MODBUS RTU模式两帧数据之前使用 3.5个字符的时间来隔开。那么3.5个字符的时间为多长??

波特决定。如波特率为9600时。发送一个字符的时间 1/9600(s)=0.104ms. 3.5个字符时间 3.5/9600(s) =0.365ms .

可以使用定时器,定时时间可以设置为1ms .

 

  • CRC校验

 

MODbus RTU模式使用的是CRC16校验。

CRC 包含由两个 8 位字节组成的一个 16 位值àCRC校验之后会得到一个16位的值。

CRC校验

生成 CRC 的过程为:
1. 将一个 16 位寄存器装入十六进制 FFFF (1). 将之称作 CRC 寄存器.
2. 将报文的第一个 8 位字节与 16 CRC 寄存器的低字节异或,结果置于 CRC 寄存器.
3. CRC 寄存器右移 1 (LSB 方向)MSB 充零. 提取并检测 LSB.
4. (如果 LSB 0): 重复步骤 3 (另一次移位).
(如果 LSB 1): CRC 寄存器异或多项式值 0xA001 (1010 0000 0000 0001).
5. 重复步骤 3 4,直到完成 8 次移位。当做完此操作后,将完成对 8 位字节的完整操作。
6. 对报文中的下一个字节重复步骤 2 5,继续此操作直至所有报文被处理完毕。
7. CRC 寄存器中的最终内容为 CRC .
8. 当放置 CRC 值于报文时,如下面描述的那样,高低字节必须交换。

11、MODBUS主机实现

按MODBUS协议的数据帧的格式来发送数据 :

主机发送数据包括:

  1. 地址域 :自行定义 (0x01) 
  2. 功能码:以0x01功能码为例

 

功能码发送过程: 功能码(1字节) + 起始地址(2字节) + 线圈数量(2字节) à先发高字节

如: 0x01 0x00 0x00 0x00 0x05

  1. 数据  à
  2. CRC
  3. 响应PDU à按照它的格式
  4. void ModbusSend_Master(u8 slaveaddr ,u8 cmd,u16 startaddr,u16 dataornum)
    {u8 sendbuf [20]={0};u16 crc;sendbuf[0]= slaveaddr;sendbuf[1]= cmd;sendbuf[2]=(u8) startaddr>>8; 		//地址高8位sendbuf[3]=(u8) startaddr & 0X00FF;  //地址低8位sendbuf[4]=(u8) dataornum >>8; 	 //读线圈数量高8位sendbuf[5]=(u8) dataornum & 0X00FF;  //读线圈数量低8位crc = CRC_Compute(sendbuf,6) ;  	 //得到CRCsendbuf[6]= (u8) crc >>8      ; 		 //得到CRC 高8位sendbuf[7]= (u8) crc&0x00ff   ; 		 //得到CRC 低8位Modbus_SendData(sendbuf,8);
    }
    ModbusSend_Master(0x01,0x01,0x0000,0x0005);

    写一个主机接收函数,参考从机接收。

相关文章:

嵌入式 STM32 通讯协议--MODBUS

目录 一、自定义通信协议 1、协议介绍 2、网络协议 3、自定义的通信协议 二、MODBUS通信协议 1、概述 2、MODBUS帧结构 协议描述 3、MODBUS数据模型 4、MODBUS事务处理的定义 5、MODBUS功能码 6、功能码定义 7、MODBUS数据链路层 8、MODBUS地址规则 9、MO…...

互联网人看一看,这些神器你用过哪些?

很多小伙伴在剪辑视频的过程中经常可以看到一些语音素材&#xff0c;经常刷视频的小伙伴也可以看到很多视频中经常出现一些AI合成的声音或者音效&#xff0c;这些配音可以给视频增添很多亮点&#xff01;那么大家都是怎么将文字转语音的呢&#xff1f;今天给大家分享5款非常专业…...

Kotlin学习:5.2、异步数据流 Flow

Flow一、Flow1、Flow是什么东西&#xff1f;2、实现功能3、特点4、冷流和热流5、流的连续性6、流的构建器7、流的上下文8、指定流所在协程9、流的取消9.1、超时取消9.2、主动取消9.3、密集型任务的取消10、背压和优化10.1、buffer 操作符10.2、 flowOn10.3、conflate 操作符10.…...

EPICS synApps介绍

一、synApps是什么&#xff1f; 1&#xff09; 一个用于同步束线用户的EPICS模块集合。 2&#xff09; EPICS模块 alive, autosave, busy, calc, camac, caputRecorder, dac128V, delaygen, dxp, ip, ip330, ipUnidig, love, mca, measComp, modbus, motor, optics, quadEM,…...

Pycharm和跳板机 连接内网服务器

Pycharm和跳板机 连接内网服务器 建立配置文件 本地配置 .ssh 文件夹下配置 config 文件 Host jumpHostName xxxPort 22User xxxServerAliveInterval 30IdentityFile C:\Users\15284\.ssh\id_rsa # 通过密钥连接Host server # 同样&#xff0c;任意名字&#xff0c;随…...

mysql去重查询的三种方法

文章目录前言一、插入测试数据二、剔除重复数据方法1.方法一&#xff1a;使用distinct2.方法二&#xff1a;使用group by3.方法三&#xff1a;使用开窗函数总结前言 数据库生成环境中经常会遇到表中有重复的数据&#xff0c;或者进行关联过程中产生重复数据&#xff0c;下面介…...

PHP反序列化

文章目录简介POP链构造和Phar://题目[CISCN2019 华北赛区 Day1 Web1]Dropbox字符串逃逸简介 php序列化的过程就是把数据转化成一种可逆的数据结构&#xff0c;逆向的过程就叫做反序列化。 php将数据序列化和反序列化会用到两个函数&#xff1a; serialize 将对象格式化成有序的…...

什么蓝牙耳机打电话效果最好?通话效果好的无线蓝牙耳机

2023年了&#xff0c;TWS耳机虽说近乎人手一只了&#xff0c;但用户换新的需求和呼声依然热火朝天&#xff0c;因为我们想要听音乐、刷视频的时候都得准备&#xff0c;下面整理一些通话效果不错的耳机品牌。 第一款&#xff1a;南卡小音舱蓝牙耳机 动圈单元&#xff1a;13.3m…...

Tesseract centos环境安装,基于springboot图片提取文字

下载tesseract-orc https://github.com/tesseract-ocr/tesseract/tags下载leptonica wget http://www.leptonica.org/source/leptonica-1.78.0.tar.gz解压leptonica tar -xvf leptonica-1.78.0.tar.gz 配置编译安装leptonica 进文件夹 ./configure make make install安装aut…...

Elasticsearch7.8.0版本优化——写入速度优化

目录一、 写入速度优化的概述二、如何写入速度优化2.1、 批量数据提交2.2、 优化存储设备2.31、 合理使用合并2.4、 减少 Refresh2.5、 加大 Flush2.6、 减少副本的数量一、 写入速度优化的概述 ES 的默认配置&#xff0c;是综合了数据可靠性、写入速度、搜索实时性等因素。实使…...

【Redis】Redis主从同步中数据同步原理

【Redis】Redis主从同步中数据同步原理 文章目录【Redis】Redis主从同步中数据同步原理1. 全量同步1.1 判断是否第一次数据同步2. 增量同步3. 优化Redis主从集群4. 总结1. 全量同步 主从第一次同步是全量同步。 数据同步包括以下三个阶段&#xff1a; 在从节点执行slaveof命令…...

Python基础—while循环

(1)while循环&#xff1a; 语法格式&#xff1a; while 条件&#xff1a;   执行语句1……   执行语句2…… 适用条件&#xff1a;无限循环 死循环 while True:print(条件是真的&#xff01;)代码实例&#xff1a; i 0 # 创建一个计数的变量 while i < 5: # Truepr…...

linux基础(管道符,检索,vim和vi编辑使用)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

GAN | 代码简单实现生成对抗网络(GAN)(PyTorch)

2014年GAN发表&#xff0c;直到最近大火的AI生成全部有GAN的踪迹&#xff0c;快来简单实现它&#xff01;&#xff01;&#xff01;GAN通过计算图和博弈论的创新组合&#xff0c;他们表明&#xff0c;如果有足够的建模能力&#xff0c;相互竞争的两个模型将能够通过普通的旧反向…...

华为面试题就这?00后卷王直接拿下30k华为offer......

先说一下我的情况&#xff0c;某211本计算机&#xff0c;之前在深圳那边做了大约半年多少儿编程老师&#xff0c;之后内部平调回长沙这边&#xff0c;回来之后发现有点难&#xff0c;这边可能是业绩难做&#xff0c;虚假承诺很厉害&#xff0c;要给那些家长虚假承诺去骗人家&am…...

html的常见标签使用

目录 1.vscode基础操作 2.html基础 语法 3.HTML文件的基本结构标签 4.注释标签 5.标题标签 6.段落标签:p 7.格式化标签 8.图片标签:img 绝对路径 相对路径 网络路径 alt属性 title属性 width/height属性 9.超链接标签:a 10.表格标签 11.列表标签 有序列表 无…...

STM32——毕设智能感应窗户

智能感应窗户 一、功能设计 以STM32F103芯片最小系统作为主控&#xff0c;实现自动监测、阈值设定功能和手动控制功能。 1、自动监测模式下&#xff1a; ① 采用温湿度传感器&#xff0c;实现采集当前环境的温度、湿度数值。 ② 采用光敏传感器&#xff0c;实现判断当前的环境…...

golang archive/tar库的学习

archive/tar 是 Golang 标准库中用于读取和写入 tar 归档文件的包。tar 是一种常见的文件压缩格式&#xff0c;它可以将多个文件和目录打包成单个文件&#xff0c;可以用于文件备份、传输等场景。 以下是一些学习 archive/tar 包的建议&#xff1a; 了解 tar 文件格式。在学习…...

MongoDB 详细教程,这一篇就够啦

文章目录1. 简介2. 特点3. 应用场景4. 安装&#xff08;docker&#xff09;5. 核心概念5.1 库5.2 集合5.3 文档6. 基本操作6.1 库6.1.1 增6.1.2 删6.1.3 改6.1.4 查6.2 集合6.2.1 增6.2.2 删6.2.3 改6.2.4 查6.3. 文档6.3.1 增6.3.2 删6.3.3 改6.3.4 查1. 语法2. 对比语法3. AN…...

python为什么慢

解释性 python是动态类型解释性语言&#xff0c;不管使用哪种解释器 因为“解释性语言”这个概念更多地是指代码的执行方式&#xff0c;而不是编译方式。在解释性语言中&#xff0c;代码在执行时会一行一行地解释并执行&#xff0c;而不是预先编译为机器语言。而即使使用了PyP…...

Android kotlin 组件间通讯 - LiveEventBus 及测试(更新中)

<<返回总目录 文章目录 一、LiveEventBus是什么二、测试一、LiveEventBus是什么 LiveEventBus是Android中组件间传递消息,支持AndroidX,Event:事件,Bus:总线 范围全覆盖的消息总线解决方案 进程内消息发送App内,跨进程消息发送App之间的消息发送更多特性支持 免配…...

linux服务器时间同步

Linux服务器时间同步 需求&#xff1a;两台以上服务器之间的时间同步&#xff0c;以其中一台服务器为时间源&#xff0c;其余服务器同步这台时间源服务器的时间 其中&#xff0c;时间源服务器需要有访问外网权限&#xff0c;不然时间源服务器无法同互联网同步最新的时间&#…...

扒系统CR8记录

目录 终极改造目标 过程记录 参考 为了将一套在线安装的系统&#xff0c;在不了解其架构、各模块细节的基础上&#xff0c;进行扒弄清楚&#xff0c;作以下记录。 终极改造目标 最终的目标&#xff0c;就是只通过CreMedia8_20230207.tar.gz解压 install 就把业务包安装了&…...

面试题(基础篇)

1、你是怎样理解OOP面向对象的面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征&#xff1a;&#xff08;1&#xff09;继承&#xff1a;继承是从已有类得到继承信息创建新类的过程&#xff08;2&#xff09;封装&#xff1a;通常认为封装是把数据和操作数据的方法…...

如何利用ReconPal将自然语言处理技术应用于信息安全

关于ReconPal 网络侦查一直是网络安全研究以及渗透测试活动中最重要的阶段之一&#xff0c;而这一阶段看起来很容易&#xff0c;但往往需要很大的努力和很强的技术才能做好来。首先&#xff0c;我们需要使用正确的工具、正确的查询/语法以及正确的操作&#xff0c;并将所有信息…...

攻略 | 6步帮助中小微企业开拓东盟机电产品市场

如何帮助中小微外贸企业在东盟市场拓展机电产品一般贸易&#xff1f;随着全球化的发展&#xff0c;越来越多的中小微外贸企业开始涉足国际贸易。对于机电产品行业而言&#xff0c;东盟市场是一个非常重要的出口目的地。本文将为您介绍如何帮助中小微外贸企业在东盟市场拓展机电…...

Linux服务器磁盘分区、挂载、卸载及报错处理

整体操作是&#xff1a;先对磁盘进行格式化&#xff0c;格式化后挂载到需要的挂载点&#xff0c;最后添加分区启动表&#xff0c;以便下次系统启动时自动挂载。一、linux分区1、Linux来说wulun有几个分区&#xff0c;分给哪一目录使用&#xff0c;他归根结底只有一个根目录&…...

JavaScript基础语法入门

一. JS简介 JavaScript , 简称JS, JS最初只是为了进行前端页面开发, 但随这后来JS越来越火之后, JS就被赋予了更多的功能, 可以用来开发桌面程序, 手机App, 服务器端的程序等… JS是一种动态类型, 弱类型的脚本语言, 通过解释器运行, 主要在客户端和浏览器上运行, 比如Chrome…...

Linux基础命令-ln创建链接文件

文章目录 ln 命令介绍 命令格式 基本参数 参考实例 1&#xff09; 创建文件的硬链接 2&#xff09;创建文件的软链接 3&#xff09;创建链接文件时&#xff0c;相同目标文件创建备份文件 命令总结 ln 命令介绍 先看下帮助文档中的含义 NAME ln - make links …...

Day21【元宇宙的实践构想07】—— 元宇宙与人工智能

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 &#x1f91e; 作者&#xff1a;那就叫我亮亮叭 &#x1f4d5; 专栏&#xff1a;元宇宙 0.0 写在前面 “元宇宙”在2021年成为时髦的概念。元宇宙到底是什么&#xff1f;元宇…...

上海网站建设过程/优化培训课程

虚拟机克隆完成之后&#xff0c;子机和母机的MAC地址、IP地址、主机名、密码都是一致的。为了不影响上网&#xff0c;需要更改这几项&#xff1a;操作系统物理地址、IP地址、主机名。4步走战略&#xff1a;1、删除网卡文件中的mac地址&#xff0c;保存退出。[rootcent67 ~]# vi…...

自己做网站地址/电商运营工作内容

from:http://www.china1024.com/bytesoft/info_show.jsp?news_id425Java RMI &#xff08;Remote Method Invocation 远程方法调用&#xff09;是用Java在JDK1.1中实现的&#xff0c;它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言&#xff0c;其…...

深圳软件公司排行/seo网站推广推荐

2019独角兽企业重金招聘Python工程师标准>>> 本文是MyEclipse方面教程&#xff0c;主要介绍在MyEclipse中该如何设置jsp页面为默认utf-8编码&#xff1f; 在MyEclispe中创建Jsp页面&#xff0c;Jsp页面的默认编码是“ISO-8859-1”&#xff0c;如下图所示&#xff1a…...

网站变量/西安新站网站推广优化

【】前言 写得比较简陋&#xff0c;没有比较周详准确的 描述&#xff0c;市场分析&#xff0c;商业模式&#xff0c;数据展示等等。 有的还没有来得及考虑更多。还没有去写。比如一些商业模式还没有去考虑。 我想到的先是这些&#xff0c;就写了这些。其他方面&#xff0c;总会…...

网站怎么做搜索/线下推广100种方式

NavigationItem 创建系统样式的UIBarButtonItemUIBarButtonItem *item [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:nil];[item setTintColor:[UIColor redColor]]; 设置item文字或图片的镂空颜色 创建标题样式的…...

国内企业建站模板/制作网站需要什么技术

修改mysql的root密码后&#xff0c;出现Host localhost is not allowed to connect to this MySQL server 错误。 解决办法&#xff1a; C:\Program Files\MySQL\MySQL Server 5.5\my.ini 在[mysqld]下加下面两行&#xff0c; skip-name-resolveskip-grant-tables 重启mysql的w…...