1. STM32与Modbus RTU协议基础认知
第一次接触工业通信协议时,我被Modbus协议简洁高效的特性所吸引。作为在工业自动化领域应用最广泛的通信协议之一,Modbus RTU模式特别适合STM32这类资源有限的嵌入式设备。与ASCII模式相比,RTU采用二进制数据格式,传输效率更高,这也是为什么大多数工业传感器和PLC都默认支持RTU模式。
Modbus协议本质上是一种主从架构的请求-响应机制。在我的多个工业控制项目中,发现主设备(通常是工控机或触摸屏)负责发起请求,而从设备(如STM32控制的传感器节点)只能在被查询时响应。这种设计虽然简单,但在实际布线时需要特别注意终端电阻的设置——我曾经在一个车间项目中因为120欧姆终端电阻缺失,导致通信距离超过50米后出现数据丢包。
STM32的USART外设与Modbus RTU堪称绝配。以STM32F103系列为例,其USART支持的最高波特率可达4.5Mbps,完全满足大多数工业场景的需求。但要注意,实际项目中我通常将波特率设置在9600-115200之间,因为更高的波特率会显著降低通信可靠性,特别是在有电磁干扰的工厂环境中。
2. 硬件环境搭建与配置要点
2.1 RS485物理层实现
选择RS485收发器芯片时,MAX3485和SP3485是我最常用的型号。这些3.3V兼容的芯片可以直接与STM32的USART对接。在PCB布局时,建议将收发器尽量靠近MCU的USART引脚,同时A/B线要并行走线并保持等长。我曾在一个电机控制项目中因为A/B线长度差异超过5cm,导致通信误码率上升。
接线时需要特别注意:
- A线(非反相端)接其他设备的A线
- B线(反相端)接其他设备的B线
- 在总线两端各接一个120Ω终端电阻
重要提示:RS485总线必须采用手拉手(daisy-chain)连接方式,绝对禁止使用星型拓扑,否则会产生信号反射导致通信失败。
2.2 STM32外设初始化
USART的配置需要特别注意以下几个参数:
c复制huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_EVEN; // Modbus RTU必须使用偶校验
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
定时器的配置同样关键,用于实现3.5字符的超时判断。我通常使用TIM2作为Modbu
