跳到主要内容

RS485 通信测试

本章使用 RS485-1 和一个 USB 转 RS485 模块完成双向收发。当前固件中 RS485-1 对应 UART5 (PJ0/PJ1,/dev/ttyAS5)。RS485-2 的 PJ4/PJ5 只能复用为 UART7,而 UART7 当前已分配给 AIC8800D80 蓝牙,所以默认固件不能同时使用蓝牙和 RS485-2。

板载功能SoC 资源当前固件设备节点
RS485-1UART5,PJ0/PJ1可用/dev/ttyAS5
AIC 蓝牙UART7,PB11~PB14默认启用/dev/ttyAS7hci0
RS485-2UART7,PJ4/PJ5 复用默认不可用与蓝牙二选一后仍为 /dev/ttyAS7
设备节点存在不等于 RS485-2 可用

默认 /dev/ttyAS7 已由 hciattach 打开并连接蓝牙。不要向它写入 RS485 数据,否则会破坏蓝牙 HCI 通信。要使用 RS485-2,必须停用蓝牙初始化、把 UART7 pinctrl 改到 PJ4/PJ5,重新编译并烧录。

准备工作

  • USB 转 RS485 模块和三根连接线
  • 一台 Ubuntu 主机
  • 当前板卡原理图或接口丝印说明
  • 串口调试和 ADB 两个终端中的至少一种
  • 已进入开发板串口终端

硬件连接

断电后连接开发板 RS485-1 和 USB 转 RS485 模块:

OmniGate-T153 RS485-1 A  -------- USB-RS485 A
OmniGate-T153 RS485-1 B -------- USB-RS485 B
OmniGate-T153 GND -------- USB-RS485 GND

RS485 接口位于开发板左侧绿色端子。A/B 的准确端子顺序以 PCB 丝印和当前批次原理图为准;没有共地时通信可能不稳定。

确认设备节点

开发板 Linux Shell执行:

ls -l /dev/ttyAS5
dmesg | grep -Ei 'ttyAS5|uart5'

当前 OmniGate Buildroot 的 Modbus RTU 默认端口为:

RS485-1:/dev/ttyAS5
默认 Modbus 参数:9600 8N1

如果 /dev/ttyAS5 不存在,先确认当前镜像和设备树,不要用其他 /dev/ttyAS* 节点盲试:

dmesg | grep -Ei 'uart5|ttyAS5'
grep -n ttyAS5 /proc/tty/driver/serial 2>/dev/null

本次 ADB 设备节点记录

本次没有连接 USB-RS485 对端,可确认 UART 节点、默认参数和 UART7 占用关系:

# dmesg | grep -Ei 'ttyAS5|ttyAS7'
uart-ng5: ttyAS5 at MMIO 0x2605000 (irq = 47, base_baud = 1500000) is a SUNXI
uart-ng7: ttyAS7 at MMIO 0x2607000 (irq = 48, base_baud = 1500000) is a SUNXI
# ls -l /dev/ttyAS5 /dev/ttyAS7
crw-rw---- 1 root root 242, 5 /dev/ttyAS5
crw-rw---- 1 root root 242, 7 /dev/ttyAS7
# stty -F /dev/ttyAS5 -a
speed 9600 baud; line = 0;
-parenb -parodd cs8 -cstopb cread clocal -crtscts
# ps | grep hciattach
360 root hciattach -n /dev/ttyAS7 aic

结果表明 RS485-1 对应的 /dev/ttyAS5 已注册,采集时串口为 9600 8N1;/dev/ttyAS7 正在被蓝牙 hciattach 使用。本记录尚未验证 RS485 收发器和 A/B 端子,必须继续做外部回环。

设置波特率

开发板 Linux Shell执行:

stty -F /dev/ttyAS5 115200 cs8 -cstopb -parenb raw -echo

插入 USB 转 RS485 后,在 Ubuntu 主机确认新出现的节点。下面假设它是 /dev/ttyUSB0

ls -l /dev/ttyUSB*
sudo stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb raw -echo

测试开发板发送

Ubuntu 主机终端 1监听:

sudo cat /dev/ttyUSB0

开发板 Linux Shell发送:

echo 'OmniGate RS485 TX' > /dev/ttyAS5

Ubuntu 主机看到 OmniGate RS485 TX,表示开发板发送正常。按 Ctrl+C 停止监听。

测试开发板接收

开发板 Linux Shell监听:

cat /dev/ttyAS5

Ubuntu 主机终端 2发送:

echo 'USB RS485 TX' | sudo tee /dev/ttyUSB0 >/dev/null

开发板看到 USB RS485 TX,表示开发板接收正常。

为什么 echo 测试只能证明基础收发

文本测试能确认 UART、收发器和 A/B 接线,但不能代替 Modbus RTU 验证。Modbus 是二进制帧, 还需要相同的地址、功能码、CRC、波特率和串口格式。基础收发通过后再使用实际主从站程序测试。

测试通过标准

  • 已根据当前批次接口丝印正确连接 A、B 和 GND。
  • 两端使用相同的波特率、数据位、停止位和校验设置。
  • 开发板发送的文本能被 Ubuntu 主机接收,主机发送的文本也能被开发板接收。

常见故障

  • 完全收不到:检查 A/B 是否接反、两端是否共地、端子是否选对;
  • 偶发乱码:确认两端均为 115200 8N1,并检查线长、屏蔽和终端电阻;
  • 只能单向:检查自动收发使能电路和对端转换器方向控制;
  • /dev/ttyAS5 busy:执行 fuser /dev/ttyAS5ps 查找占用进程;
  • RS485-2 不工作:这是当前蓝牙/UART7 资源选择,不是靠 chmod 设备节点可以解决的。

量产验收时,应分别记录两路接口的设备节点、端子顺序、波特率、收发结果和蓝牙取舍。

转换器型号:
开发板节点:/dev/ttyAS5
主机节点:/dev/ttyUSB__
串口参数:115200 8N1
开发板 → 主机:通过 / 失败
主机 → 开发板:通过 / 失败