硬汉嵌入式论坛

 找回密码
 立即注册
查看: 72|回复: 4
收起左侧

[UART] DMA+Modbus

[复制链接]

4

主题

10

回帖

22

积分

新手上路

积分
22
发表于 11 小时前 | 显示全部楼层 |阅读模式
各位大神好,

     大家知道Modbus协议是全宇宙设备免费通用的交互通信协议,在嵌入式单片机通信里,是绕不过去的协议。
     嵌入式工程师在实现Modbus从机时,通常会面临三种接收方案的选择:
      1 轮询方式:CPU不断查询USART接收寄存器状态,简单但CPU占用率极高
      2 基础中断接收:每个字节触发中断,频繁中断导致系统响应延迟
      3 DMA+空闲中断:DMA自动搬运数据,空闲中断精准判断帧结束
    以下是这三种方案的优略比较,很明显,第3种方案是最优选择。
       ScreenShot_2026-06-10_102347_765.png
    有哪位大神能系统讲讲DMA+空闲中断方式的Modbus通信啊,最好能有个实例辅助验证讲解,
    在网上也查了好多,好的讲解都是夸夸其谈或者AI生成的美文,应用起来各种问题,
    硬汉大神有好几版讲Modbus通信的实例+示例程序的,讲的非常好,非常仔细,
   也希望硬汉大神团队,能否更新版Modbus通信,把Modbus通信升级到DMA+空闲中断模式,给大家讲解讲解。
   
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123011
QQ
发表于 6 小时前 | 显示全部楼层
空闲中断方式不行,因为空闲中断是固定的一个字符间隔空闲,不是Modbus协议的3.5个字符,不符合协议规范。
回复

使用道具 举报

30

主题

318

回帖

408

积分

高级会员

积分
408
QQ
发表于 5 小时前 | 显示全部楼层
如果是 modbusRTU 485 通信,那简直和 DMA 是天生绝配。

整个功能各个部分全都是“通道化”的思维。

modbusRTU 主->从 从->主 的通道
485 收通道 发通道
DMA 搬运通道

只是 1.5 字符和 3.5 字符,要额外增加一个轮询机制结合空闲中断来计时,推荐楼主深入研究。
回复

使用道具 举报

9

主题

16

回帖

48

积分

新手上路

积分
48
发表于 5 小时前 | 显示全部楼层
合适的mcu(如stm32h743,基本上st新的ic的usart ip都很强大)可以做到硬件高效收发,减少软件处理:usart支持硬件控制485的en脚,支持硬件超时功能设置(非空闲中断),支持dma收发。
回复

使用道具 举报

18

主题

51

回帖

105

积分

初级会员

积分
105
发表于 5 小时前 | 显示全部楼层
我来说说实际应用吧,用空闲中断确实不满足协议规定的3.5字符间隔,实际使用并没啥问题,我的项目都是115200,dma+idle,设备覆盖10余个品类,其中3个品类出货量2w+,其余零零散散也有1w+出货量,目前没发现问题,我设备的使用环境也包括电磁干扰比较强的地方,用于发动机启停控制
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-6-10 21:36 , Processed in 1.014572 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表