STM32配置Modbus通信详解
目录
一、前言
本篇笔记讲解modbus通讯的大概配置流程,梳理通讯过程,由于项目代码参杂了许多其他内容,故代码部分以后有时间再贴出来。
二、通讯原理
2.1 modbus基础概念:
线圈寄存器:一般用来操作单个开关量,1bit对应一个开关状态,1byte控制8路开关,对应功能码01,05,15
比如报文:08 05 00 06 00 00 6C A2
意为主机向从机08的06的地址写开关状态(功能码05写开关),控制16路bit为低。
离散输入寄存器:和线圈一样,但只读。
保持寄存器:一般用来传输数据,根据需要可以选择一次传输和多次传输,对应功能码为03,06,16
输入寄存器:和保持寄存器一样,但只读,对应功能码04.
无论modbus怎么传输,都遵循基本的传输格式
因此在程序处理上,需要将接收到的modbus帧进行解析处理,还原出地址,功能码,数据,以及校验,不同的功能码按照上面的功能码表,分别对应不同的读写功能,将数据按照接收到的地址写入或读出。
三、配置步骤
modbus使用差分信号传输数据,而ARM只能发出单线串口信号,因此stm32需要使用串口usart和外部485芯片差分出modbus信号,stm32配置modbus通讯有两种方式,一种是采用USART+定时器方式,另一种是USART+DMA方式;推荐使用后者,因为串口发送比较占用时间(毫秒级),在高系统调用的项目中(微秒级),至少要使TX部分采用DMA发送。
PS:RX部分可以采用串口空闲中断+DMA方式接收数据,但实测中发现DMA接收的数据总是在第一位发生错乱,暂不清除原因,欢迎评论区大佬指正。
在STM32上使用Modbus通信协议配置从机步骤:
步骤1:配置串口模块
可以使用串口通信的例程加以改动,设置波特率、数据位、停止位和校验位等参数,以确保与Modbus设备的通信兼容。
步骤2:解析Modbus数据包
在STM32上编写代码以解析从Modbus主设备接收到的数据包。在Modbus协议中,每个数据包都包含多个数据字段,例如地址码、功能码、数据字节和CRC校验码等。因此,需要编写代码来识别这些不同的字段,并将它们提取出来以便后续的数据处理。
步骤3:处理Modbus数据
将接收到的Modbus数据将被转换为与实际应用程序相关的数据类型。
步骤4:发送Modbus命令
将数据装入指定内存,通过串口发送。
需要注意的是,modbus RTU通信中,报文帧与报文帧的间隔一般在3.5个字符之间,在程序中对应4ms左右,即当通信总线超过4ms无数据时,认为当前报文已结束,落实到程序上就是当接收完成时定时4ms以上的时间内无接收中断,记当前报文结束;或者接收空闲时开启DMA传输,这也是定时器方式和DMA方式的主要区别。
附录:
Modbus协议详解
作者:liansmo