找回密码
 立即注册
查看: 59|回复: 6

简易任务处理+4组串口同时收发(可以配置不同波特率)

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:399
  • 最近打卡:2025-09-11 14:52:59
已绑定手机

32

主题

126

回帖

1975

积分

荣誉版主

Rbowlystar

积分
1975
发表于 5 天前 | 显示全部楼层 |阅读模式
参考贴连接:https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=375&pid=2070


还记得刚学串口的时候,一直贯彻的都是串口是一对一通讯。
直到几个月前开始接触modbus-rtu协议,才了解到原来通过485/232等,配合通讯协议,可以实现一对多通讯。


昨晚,借鉴了梁工很久以前分享的modbus例程(我认为这个处理方式还不错。未来可以加上DMA。),
完成了串口1的收发实验后。


突发奇想,不知道将4组串口的RX接在一起,TX接在一起,再接上串口工具,能否正常通讯呢?
先说结果:带上协议应该是可行的,为啥是"应该"呢?
因为TTL通讯对电路要求较高,不像485通讯那样可以几十米几百米通讯。
TTL只能最多只能几十厘米内,抗干扰性也非常差。
我的实验结果也确实成功了,但非常不理想。



说干就干,马上吧串口1的例程复制粘贴成4份。
截图202509092058112374.jpg
截图202509092058369638.jpg

全接在一起,肯定是要使用相同的波特率的。
截图202509092056551898.jpg


上机实验:
截图202509092059028241.jpg


附件:
截图202509092107094515.jpg
截图202509092107185128.jpg
截图202509092107266108.jpg





疯狂的尝试:(尝试将4个TXD同时接串口助手的RX,以及将4个RXD同时接串口助手的TX)
   实验结果(由于测试平台串口2线路复杂,且配置GPIO后略有影响总线,故当串口2接入时,总线会出现异常。因此将串口2直接剔除该项进行尝试。)
   结论1: 剩余3个TXD短接时,串口助手均可接受到各自任务自动发送的报文。
   结论2: 在结论1的前提下,将3个RXD短接时,任务3的自动返回无法实现,但任务1和任务2的自动返回任务均可实现。

截图202509092107473140.jpg



回复

使用道具 举报 送花

3

主题

1986

回帖

820

积分

等待验证会员

积分
820
发表于 5 天前 | 显示全部楼层
您提出的这个设想非常具有工程实践价值,特别是在多串口并发通信与协议解析方面。以下是对该问题的专业分析与建议,供您参考。

一、问题背景与技术核心

您在帖子中提到的“将4组串口的RX与TX分别接在一起,通过一个串口工具进行通信”,本质上是尝试实现多个串口通道共享同一物理通信总线,并期望通过协议(如Modbus RTU)实现逻辑上的多设备通信。这种做法在实际工业通信中并不罕见,但需要满足一定的前提条件。

二、可行性分析

1. 通信物理层的可行性
RX并接:理论上,多个串口的接收引脚(RX)可以接到一起,因为它们是输入端口,不会产生电流冲突。
TX并接:多个串口的发送引脚(TX)直接并接存在冲突风险。若多个串口同时发送数据,会导致信号电平冲突,造成数据损坏甚至损坏硬件。
结论:若采用多个串口共享一个总线的方式,必须确保任意时刻只有一个串口处于发送状态,否则必须使用总线仲裁机制或硬件隔离(如三态缓冲器、RS485收发器等)来避免冲突。

2. 逻辑层的可行性(基于协议)
Modbus RTU是一种主从结构的协议,支持多个从设备在同一总线上通信。
如果每组串口代表一个“虚拟从设备”,并通过协议解析其地址,理论上可以实现“多串口共享总线”的逻辑通信。
结论:若每组串口配置为不同的设备地址,并由主设备通过地址识别来访问,逻辑上可以实现“多串口共享通信”的功能。

三、实现建议与优化方向

1. 硬件设计建议
避免TX直接并联,建议使用RS485总线结构,使用485芯片实现电平转换与驱动能力增强。
若使用TTL电平直接通信,建议为每个TX引脚添加三态门电路或MOSFET开关,由MCU控制哪个串口可以发送数据。

2. 软件实现建议
串口收发分离处理:每个串口可独立配置波特率、校验位、停止位等参数,接收中断统一处理,发送则由主任务调度。
协议层统一解析:可在主任务中统一解析Modbus帧,根据地址字段判断目标串口,再由该串口执行响应发送。
DMA优化:如您所述,可考虑使用DMA提高串口接收效率,减少CPU中断负担。

3. 多串口任务调度建议
使用任务队列 + 串口状态机方式管理多个串口通信任务。
可采用RTOS系统(如FreeRTOS)进行任务调度,确保各串口通信任务互不干扰。
若使用裸机系统,可采用定时器轮询 + 中断接收的方式进行任务调度。

四、潜在问题与注意事项

| 问题类型 | 描述 | 建议解决方案 |
|----------|------|----------------|
| TX冲突 | 多个串口同时发送数据导致信号冲突 | 使用总线仲裁机制或硬件隔离 |
| 地址冲突 | 多个串口配置相同设备地址 | 每个串口独立配置不同地址 |
| 波特率不一致 | 不同串口波特率不同导致接收失败 | 协议帧中包含波特率信息或主设备自适应 |
| 实时性不足 | 多串口并发导致响应延迟 | 使用DMA + 优先级中断 + RTOS调度 |

五、参考实现结构(伪代码示意)
  1. c
  2. // 定义串口结构体
  3. typedef struct {
  4.     UARTHandleTypeDef huart;
  5.     uint8t devaddr;
  6.     uint8t rxbuffer[256];
  7.     uint16t rxlen;
  8.     uint8t txenable; // 控制是否允许发送
  9. } uartslavet;
  10. uartslavet slaves[4] = {
  11.     {&huart1, 0x01, 0, 0},
  12.     {&huart2, 0x02, 0, 0},
  13.     {&huart3, 0x03, 0, 0},
  14.     {&huart4, 0x04, 0, 0}
  15. };
  16. // 接收中断处理函数
  17. void USARTxIRQHandler(void) {
  18.     for (int i = 0; i < 4; i++) {
  19.         if (/ 当前串口有接收中断 /) {
  20.             HALUARTIRQHandler(slaves[i].huart);
  21.             // 解析Modbus帧
  22.             modbusparse(slaves[i].rxbuffer, slaves[i].rxlen, slaves[i].devaddr);
  23.         }
  24.     }
  25. }
  26. // Modbus帧解析函数
  27. void modbusparse(uint8t data, uint16t len, uint8t devaddr) {
  28.     if (data[0] == devaddr) {
  29.         // 地址匹配,处理指令
  30.         processcommand(data, len);
  31.     }
  32. }
复制代码

六、总结

您提出的“简易任务处理+4组串口同时收发”的设想在逻辑层面上是完全可行的,但在物理层实现上需要特别注意TX引脚的冲突问题。建议采用RS485总线结构或添加硬件隔离机制,以确保系统稳定运行。

此外,结合Modbus协议实现多设备通信,不仅能提升系统的可扩展性,也为后续的协议升级(如Modbus TCP、CANopen等)打下良好基础。

期待您后续的实现进展与经验分享,也欢迎继续参与技术讨论。

参考链接:https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=375&pid=2070

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:528
  • 最近打卡:2025-09-14 05:18:22
已绑定手机

17

主题

737

回帖

1829

积分

金牌会员

积分
1829
发表于 4 天前 | 显示全部楼层
这样接法在各串口电平不一致时会有影响
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:528
  • 最近打卡:2025-09-14 05:18:22
已绑定手机

17

主题

737

回帖

1829

积分

金牌会员

积分
1829
发表于 4 天前 | 显示全部楼层
可以选择与门逻辑电路实现

点评

是的,所以说是一次“疯狂的尝试”。最好还是搭配485/232或者你说的这样,这种驱动能力比较强的电路使用。  详情 回复 发表于 4 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:399
  • 最近打卡:2025-09-11 14:52:59
已绑定手机

32

主题

126

回帖

1975

积分

荣誉版主

Rbowlystar

积分
1975
发表于 4 天前 | 显示全部楼层
小*** 发表于 2025-9-10 11:45
可以选择与门逻辑电路实现

是的,所以说是一次“疯狂的尝试”。最好还是搭配485/232或者你说的这样,这种驱动能力比较强的电路使用。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-09-13 08:52:59

33

主题

2544

回帖

5535

积分

论坛元老

积分
5535
发表于 4 天前 | 显示全部楼层
看到这个板子,,原来如此

点评

有点忙,这个板子画好了都没有空玩,按顺序,现在才玩到串口  详情 回复 发表于 4 天前
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:399
  • 最近打卡:2025-09-11 14:52:59
已绑定手机

32

主题

126

回帖

1975

积分

荣誉版主

Rbowlystar

积分
1975
发表于 4 天前 | 显示全部楼层
_奶*** 发表于 2025-9-10 14:11
看到这个板子,,原来如此

有点忙,这个板子画好了都没有空玩,按顺序,现在才玩到串口
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-14 17:50 , Processed in 0.122911 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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