SANPO USB 转 RS485

SANPO USB 转 RS485 适合从电脑端指定 RS485-1/2/3/4 中的某一路发送数据。上位机把设备原始指令放入 RT 封装帧,开发板只负责选择接口和转发,不会修改电机协议内容。

如果希望直接发送不带 SANPO 封装的数据,请使用 RS485 原始数据透传;连续高速实时控制请使用本页的 RT 封装协议。

连接和通信参数

完整开发板通常会出现两个 USB 串口。其中一个访问 RS485-1/2,另一个访问 RS485-3/4。首次使用时建议只连接一个设备,确认 USB 串口和物理接口的对应关系。

出厂默认 RS485 参数为 4 Mbps、1 个停止位、无校验、8 个数据位。使用前发送 AT+SETRS485? 查询;需要修改时参考 通信参数配置。USB 串口软件中选择的波特率不会改变 RS485 总线参数。

选择 RS485 接口

当前 USB 串口

Channel

发送目标

对应 RS485-1/2

0x01

RS485-1

对应 RS485-1/2

0x02

RS485-2

对应 RS485-3/4

0x03

RS485-3

对应 RS485-3/4

0x04

RS485-4

任意一个 USB 串口

0x00

当前 MCU 的两路 RS485

发送时 1/3 都选择当前 MCU 的第一路,2/4 都选择第二路。回包使用本地 Channel:第一路返回 0x01,第二路返回 0x02

RT 报文格式

发送和接收使用相同的外层格式:

字段

长度

说明

帧头

2 字节

固定 52 54,即 RT

Channel

1 字节

RS485 接口编号

数据长度

1 字节

原始 RS485 数据长度,最大 64 字节

数据

0~64 字节

设备厂家定义的原始指令或反馈

帧尾

2 字节

固定 0D 0A

开发板向 RS485 总线发送时会去掉 RT、Channel、长度和帧尾,只发送中间的原始数据。设备反馈时,开发板重新添加 RT 外层,并在 Channel 中标出数据来自本地第一路还是第二路。

宇树 GO-M8010 示例

宇树原始控制帧:

FE EE 11 00 00 00 00 00 00 00 00 00 00 00 00 18 7C

将这 17 字节数据发送到 Channel 2:

52 54 02 11 FE EE 11 00 00 00 00 00 00 00 00 00 00 00 00 18 7C 0D 0A

其中 02 是目标接口,11 是十六进制的 17。RS485 总线上实际发送的仍然只是以 FE EE 开头的 17 字节宇树指令。

电机反馈会类似下面的形式返回:

52 54 02 10 FD EE ...共16字节电机反馈... 0D 0A

完整示例程序:USB 转 RS485 宇树电机示例

Windows 示例:

python usb2rs485_unitree_demo_v6.py --port COM9 --motors 1 --channel 2

Linux 示例:

sudo python3 usb2rs485_unitree_demo_v6.py --port /dev/ttyACM0 --motors 1 --channel 2

回包处理

一次 RS485 接收事件对应“一段连续收到的数据”,不保证正好是一条完整的电机协议帧。Channel 可以确认数据来自哪一路接口,但上位机仍应按照电机协议的帧头、长度和校验重组完整反馈。

USB 同样是字节流,一次读取可能得到半帧或多帧。解析时应先找到 52 54,读取长度字段,再等待完整的 6 + 数据长度 字节。

常见问题

现象

处理方法

指令被发到两路 RS485

Channel 为 0x00;改为具体通道

发送后没有反馈

检查 USB 串口、Channel、RS485 参数、设备 ID、指令校验、A/B 接线和供电

回包 Channel 显示 1/2 而不是 3/4

回包使用当前 MCU 的本地编号,属于正常行为

回包没有 52 54

当前开启了 RAW 回包;发送 AT+RS485RAW=0

需要直接发送 RS485 原始数据

RS485 原始数据透传开启 RAW 回包

回包被拆成多段

RT 长度字段重组外层帧,再按电机协议解析 Data