工业现场设备通常需要多路串口并行工作,GD32F30x 的多路 USART + 中断/DMA 组合可以很好地满足需求。本文记录基于 GD32F30x 实现多路串口与 Modbus RTU 从站的实战要点。
1. 多路串口资源规划
GD32F30x 提供多路 USART/UART,先按波特率与功能划分:调试口独立一路,通信口按链路分配。每路串口建议配置独立的接收缓冲区与状态机,避免相互干扰。接收用空闲中断 + DMA 组合可大幅降低 CPU 占用。
2. Modbus RTU 帧处理
RTU 帧以 3.5 字符静默间隔作为帧分隔,波特率较低时需注意定时器计时精度。解析时先校验从站地址与 CRC16,再分发功能码。实测在 9600bps 下,用定时器实现的帧超时判定比字节计数更可靠。
3. 寄存器模型设计
将保持寄存器、输入寄存器统一映射到内存数组,读写函数通过地址偏移访问,便于扩展。写多寄存器时注意先做边界检查,防止越界写坏内存。
4. 中断优先级与响应
通信中断优先级要高于普通任务中断,但低于关键实时任务。Modbus 从站响应时间受中断嵌套影响,必要时可在接收完成后延迟数毫秒再组帧回复,保证时序稳定。
5. 常见坑
- 多路串口共用一个中断入口时忘记区分中断标志,导致误判;
- CRC 计算使用查表法时初始值与多项式搞错;
- 未做奇偶校验配置,导致通信偶发错帧。
以上为工业项目中的实践记录,欢迎大家交流补充。 |
|