这一章在干嘛?
485 实验:差分传输、半双工收发自动切换、SP3485 收发器、与串口助手的距离测试。学会后做 Modbus 通信就上手。
28.1 485 简介
RS-485 是工业总线标准:
- 差分传输:A/B 两根线压差代表逻辑;
- 半双工:同一时刻只能发或收;
- 距离:1200 m(典型);
- 节点数:最多 32(标准驱动器),现代收发器可到 256。
原书图 28.1.1:RS-485 差分信号
电平标准:
| 电平 | A-B 电压 |
|---|---|
| 逻辑 1 (Mark) | +2 V ~ +6 V |
| 逻辑 0 (Space) | -6 V ~ -2 V |
SP3485 收发器:3.3V/5V 通用,自动收发切换(靠 TX/RX 信号互斥)。
485 与串口:485 只是一种物理层,协议层还是 UART(异步串口)。所以 485 程序基本就是串口程序 + 一个收发控制引脚。
28.2 硬件设计
USART2(PA2/PA3)接 SP3485,PG8 控制收发切换(高发低收)。
原书图 28.2.1:SP3485 接线图
28.3 程序设计
28.3.1 CubeMX 配置
- USART2 → 115200-8-N-1
- PD5 / PD6 接两个 LED 指示收发
28.3.2 关键代码
// 发送
void rs485_send(uint8_t *buf, uint16_t len) {
RS485_TX_MODE(); // PG8 = 1
HAL_UART_Transmit(&huart2, buf, len, 100);
while (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) == RESET);
RS485_RX_MODE(); // PG8 = 0
}
// 接收(中断)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART2) {
LED1_TOGGLE();
HAL_UART_Receive_IT(&huart2, &rx_byte, 1);
}
}
28.4 下载验证
两块开发板 A/B 对连,A 发 B 收:串口助手观察。开发板上 LED 闪烁表示收发正常。
必须用双绞线,且 120Ω 终端电阻在线缆两端各一个,否则长距离波形反射导致误码。
RS-485 用几根差分信号线?
2 根(A、B)。
485 是半双工还是全双工?
半双工,靠收发切换。
通信距离最远多少?
1200 m(典型值)。