当前位置: 首页 > 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…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...