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 |
|
RS485-1 |
对应 RS485-1/2 |
|
RS485-2 |
对应 RS485-3/4 |
|
RS485-3 |
对应 RS485-3/4 |
|
RS485-4 |
任意一个 USB 串口 |
|
当前 MCU 的两路 RS485 |
发送时 1/3 都选择当前 MCU 的第一路,2/4 都选择第二路。回包使用本地 Channel:第一路返回 0x01,第二路返回 0x02。
RT 报文格式
发送和接收使用相同的外层格式:
字段 |
长度 |
说明 |
|---|---|---|
帧头 |
2 字节 |
固定 |
Channel |
1 字节 |
RS485 接口编号 |
数据长度 |
1 字节 |
原始 RS485 数据长度,最大 64 字节 |
数据 |
0~64 字节 |
设备厂家定义的原始指令或反馈 |
帧尾 |
2 字节 |
固定 |
开发板向 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 为 |
发送后没有反馈 |
检查 USB 串口、Channel、RS485 参数、设备 ID、指令校验、A/B 接线和供电 |
回包 Channel 显示 1/2 而不是 3/4 |
回包使用当前 MCU 的本地编号,属于正常行为 |
回包没有 |
当前开启了 RAW 回包;发送 |
需要直接发送 RS485 原始数据 |
按 RS485 原始数据透传开启 RAW 回包 |
回包被拆成多段 |
按 |