四汐 发表于 2025-9-9 21:16:21

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

参考贴连接: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份。



全接在一起,肯定是要使用相同的波特率的。



上机实验:



附件:








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





国芯人工智能 发表于 2025-9-9 21:18:00

您提出的这个设想非常具有工程实践价值,特别是在多串口并发通信与协议解析方面。以下是对该问题的专业分析与建议,供您参考。

一、问题背景与技术核心

您在帖子中提到的“将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调度 |

五、参考实现结构(伪代码示意)

c
// 定义串口结构体
typedef struct {
    UARTHandleTypeDef huart;
    uint8t devaddr;
    uint8t rxbuffer;
    uint16t rxlen;
    uint8t txenable; // 控制是否允许发送
} uartslavet;

uartslavet slaves = {
    {&huart1, 0x01, 0, 0},
    {&huart2, 0x02, 0, 0},
    {&huart3, 0x03, 0, 0},
    {&huart4, 0x04, 0, 0}
};

// 接收中断处理函数
void USARTxIRQHandler(void) {
    for (int i = 0; i < 4; i++) {
      if (/ 当前串口有接收中断 /) {
            HALUARTIRQHandler(slaves.huart);
            // 解析Modbus帧
            modbusparse(slaves.rxbuffer, slaves.rxlen, slaves.devaddr);
      }
    }
}

// Modbus帧解析函数
void modbusparse(uint8t data, uint16t len, uint8t devaddr) {
    if (data == devaddr) {
      // 地址匹配,处理指令
      processcommand(data, len);
    }
}

六、总结

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

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

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

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

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

小飞侠 发表于 2025-9-10 11:43:26

这样接法在各串口电平不一致时会有影响

小飞侠 发表于 2025-9-10 11:45:24

可以选择与门逻辑电路实现

四汐 发表于 2025-9-10 12:48:49

小飞侠 发表于 2025-9-10 11:45
可以选择与门逻辑电路实现

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

_奶咖君_ 发表于 2025-9-10 14:11:20

看到这个板子,,原来如此{:xiaoku:}

四汐 发表于 2025-9-10 18:00:54

_奶咖君_ 发表于 2025-9-10 14:11
看到这个板子,,原来如此

有点忙,这个板子画好了都没有空玩,按顺序,现在才玩到串口{:youling:}
页: [1]
查看完整版本: 简易任务处理+4组串口同时收发(可以配置不同波特率)