嵌入式 STM32 通讯协议--MODBUS

news2024/11/18 3:41:03

目录

一、自定义通信协议

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) ;  	 //得到CRC
    	sendbuf[6]= (u8) crc >>8      ; 		 //得到CRC 高8位
    	sendbuf[7]= (u8) crc&0x00ff   ; 		 //得到CRC 低8位
    	Modbus_SendData(sendbuf,8);
    }
    ModbusSend_Master(0x01,0x01,0x0000,0x0005);

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 2.x ——使用 mail 实现邮件发送

文章目录前言环境、版本等pom依赖引入springboot项目配置文件获取邮箱授权码配置properties文件定义接口信息接收类编写邮件发送服务类编写接口swagger测试1、简单邮件发送2、html格式发送(支持附件)前言 最近再看xxl-job的源码&#xff0c;其中在邮件告警通知中使用到了告警信…

Go调用dll 解决方案 dll查看工具

准备工作 Go需要1.10版本&#xff0c;即支持动态链接库 基本调用代码 lib : syscall.NewLazyDLL("lib/plugin.dll") // 读取dll f : lib.NewProc("Sum") // 调用dll函数 res, _, _ : f.Call(param) // 传值 fmt.Println(res)可能出现的问题 %1 is not a …

移动硬盘不显示怎么办?恢复硬盘的方法汇总

在日常工作和生活中&#xff0c;移动硬盘是非常重要的存储设备&#xff0c;它们可以储存大量的数据&#xff0c;比如照片、音乐、视频、文档等。但是&#xff0c;有时候你可能会遇到移动硬盘不显示的问题。这个问题通常会让人感到困惑&#xff0c;因为你无法访问移动硬盘里的数…

Appium自动化测试之启动时跳过初始化设置

Appium每次启动时都会检查和安装Appium Settings&#xff0c;这是完全没有必要的&#xff0c;在首次使用Appium连接设备是Appium Settings便已经安装好。怎样跳过安装Appium Settings呢&#xff1f;之前的做法是修改appium中的源文件中的android-helpers.js实现&#xff0c;如M…

足球俱乐部管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;网站是一种主要的渠道。人们通过互联网快速、准确的发布信息、获取信息。而足球俱乐部是足球职业化、专业化的一个标志&#xff0c;是足球运动员以足球谋生时&#xff0c;所被聘用的机构&#xff0c;应运时代发展&#xff0c;规模、…

观测云产品更新|新增用户访问监测自动化追踪;新增 CDN 质量分析;新增自定义查看器导航菜单等

观测云更新 用户访问监测优化 新增用户访问监测自动化追踪 用户访问监测新增自动化追踪&#xff0c;通过“浏览器插件”的实现方式&#xff0c;使用浏览器记录用户访问行为&#xff0c;创建无代码的端到端测试。更多详情可参考文档【 自动化追踪 】https://docs.guance.com/…

本机安装docker,redis并进行连接实战

1、背景 win10系统&#xff0c;想要在本机搭建一套开发环境&#xff0c;需要安装zk&#xff0c;redis等组件&#xff0c;一个个的安装显然效率太低且复杂&#xff0c;这里考虑安装docker及相关镜像 2、 docker安装 docker官网下载:https://docs.docker.com/desktop/install/…

Git的简述

Git 文章目录GitGit概述版本控制工具集中式管理控制工具分步式管理控制工具控制机制Git和代码托管中心安装Git软件Git常用命令Git概述 Git是一个免费的、开源的分步式版本控制系统&#xff0c;可以快速的处理从小型到大型的各种项目 Git 易于学习&#xff0c;占地面积小&…

【Linux | ELK 8.2】搭建ELKB集群Ⅱ—— 安装 Logstash 和 Kibana

目录2.3 安装Logstash&#xff08;1&#xff09;检查系统jdk版本&#xff08;2&#xff09;下载logstash&#xff08;3&#xff09;安装logstash&#xff08;4&#xff09;配置logstash&#xff08;5&#xff09;启动与测试方法1方法2&#xff08;主要的使用方式&#xff09;&a…

Python--深入浅出的装饰器--1

本章一起深入浅出一下装饰器。前面我们讲过一章装饰器了。不知道各位看懂了多少。每太看懂也没关系&#xff0c;本章就一起实操一下。简单的例子例1例2上述的两个例子&#xff0c;执行结果为&#xff1a;1423.为什么呢&#xff1f;&#xff1f;&#xff1f;解析语法糖&#xff…

sed 功能详解

介绍sedsed是一种流编辑器&#xff0c;它一次处理一行内容&#xff0c;把当前处理的行存储在临时缓冲区中&#xff08;buffer&#xff09;,称为"模式空间"&#xff0c;接着sed命令处理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲区的内容送往屏幕&#…

面向Elasticsearch的高性能应用网关INFINI Gateway的介绍

1.微服务的API网关介绍网关的含义很多&#xff0c;应用范围也很广&#xff0c;不同的领域理解也不一样&#xff0c;站在分布式领域基于微服务的架构风格中&#xff0c;API网关其实就是一个微服务系统的统一入口。往往微服务是指由多个应用组成的一个个独立的服务系统&#xff0…

【C/C++】类型限定符extern、const、Volatile、register

1、extern&#xff1a; 声明一个变量&#xff0c;extern声明的变量没有建立存储空间。 extern int a ; //变量在定义的时候创建存储空间。 ①当我们在编译器中试图运行以下代码&#xff0c;系统会报错。 错误原因是“无法解析外部符号_a”.系统认为变量a是没有开辟内存空间的…

【3】MyBatis+Spring+SpringMVC+SSM整合一套通关

三、SpringMVC 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体…

网络应用之静态Web服务器-多任务版

静态Web服务器-多任务版学习目标能够写出多线程版的多任务web服务器程序1. 静态Web服务器的问题目前的Web服务器&#xff0c;不能支持多用户同时访问&#xff0c;只能一个一个的处理客户端的请求&#xff0c;那么如何开发多任务版的web服务器同时处理 多个客户端的请求?可以使…

ROS进行深度相机的标定

前言 自己使用标定板对深度相机进行标定。 参考&#xff1a;http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration 一、准备标定板 在下面的网站中可下载棋盘格标定板&#xff0c;可用A4纸打印下来。 http://wiki.ros.org/camera_calibration/Tutorials/…

Spring Boot整合Kaptcha实现验证码功能

目录一、前言1.Kaptcha 简介2.Kaptcha 详细配置表二、实现1.整合kaptcha&#xff0c;创建kaptcha的工具类1.1 添加依赖1.2 创建KaptchaConfig工具类2 编写接口&#xff0c;在接口中使用 kaptcha 工具类来生成验证码图片&#xff08;验证码信息&#xff09;并返回3 登录时从sess…

阻塞队列BlockingQueue

一、概念阻塞队列&#xff1a;从名字可以看出&#xff0c;他也是队列的一种&#xff0c;那么他肯定是一个先进先出&#xff08;FIFO&#xff09;的数据结构。与普通队列不同的是&#xff0c;它支持两个附加操作&#xff0c;即阻塞添加和阻塞删除方法。如上图&#xff0c;线程1往…

2023年值得参加的数学建模竞赛介绍

数学建模竞赛&#xff1a;一次参与&#xff0c;终身受益 博主7年数学建模竞赛经验&#xff0c;历史获奖率百分之百。团队成员都是拿过全国一等奖的硕博&#xff0c;有需要数模竞赛帮助的可以私信我。 有同学咨询还有那些数学建模比赛可以参加&#xff0c;哪些含金量比较高&…

Qt图片定时滚动播放器+透明过渡动画

目录参考结构PicturePlay.promain.cppmyqlabel.h 自定义QLabelmyqlabel.cpp自定义QLabelpictureplay.hpictureplay.cpppictureplay.uistyle.qss效果源码参考 Qt图片浏览器 QT制作一个图片播放器 Qt中自适应的labelpixmap充满窗口后&#xff0c;无法缩小只能放大 Qt的动画类修改…