目录

  • 一、前言
  • 二、通讯原理
  • 2.1 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

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32配置Modbus通信详解

    发表回复