USB CDC串口转 RS485
USB CDC串口转 RS485 支持两种方式:
SANPO
RT封装帧:默认工作模式。在原始 RS485 数据外层增加RT / Channel / Len / 帧尾,可逐帧指定 RS485 通道和数据长度。RS485 原始数据透传:兼容宇树等第三方 RS485 上位机。需要通过
AT+RS485RAW=1开启,上电后默认恢复为非透传的RT封装帧模式。
生产环境建议使用 SANPO RT 封装帧。原始数据透传主要用于通过第三方上位机调试或设置设备参数,例如使用宇树原厂电机上位机配置电机。
SANPO RT 封装帧
SANPO RT 封装帧是 USB CDC串口侧的变长外层帧,固定以 0x0D 0x0A 结尾。固件收到后根据 Channel 选择 RS485 通道,并只把 Data 字段发送到 RS485 总线。
0x52 0x54 + Channel(1B) + Len(1B) + Data(0~64B) + 0x0D 0x0A
字段说明
字段 |
说明 |
|---|---|
|
ASCII |
|
|
|
RS485 真实有效数据长度,范围 |
|
需要发送到 RS485 总线的原始数据 |
|
SANPO |
SANPO RT 封装帧示例
帧头 |
Channel |
Len |
Data |
帧尾 |
|---|---|---|---|---|
|
|
|
|
|
Python 示例
完整代码样例请参考 usb2rs485_unitree_sine_demo_v6.py
TAIL = bytes([0x0D, 0x0A])
def build_usb_rs485_rt(channel: int, payload: bytes) -> bytes:
payload = payload[:64]
return bytes([0x52, 0x54, channel & 0xFF, len(payload)]) + payload + TAIL
RS485 原始数据透传模式
RS485 原始数据透传模式通过 USB CDC串口 AT+ 指令控制。使用串口工具发送时,只输入命令主体,并把发送结束符设置为 CRLF。
命令 |
说明 |
|---|---|
|
查询当前是否处于 RS485 原始数据透传模式 |
|
开启 RS485 原始数据透传模式 |
|
关闭 RS485 原始数据透传模式,恢复 SANPO |
固件默认处于非透传的 RT 封装帧模式。AT+RS485RAW=1 只改变当前运行状态,不作为上电默认配置保存;设备重新上电后会自动恢复为非透传模式。
开启原始数据透传后,固件不会解析第三方协议内容,也不会改写数据。上位机发送什么字节,固件就把这些字节转发到 RS485 总线;RS485 设备返回的数据内容也保持原样,上位机可以从 USB CDC串口返回数据中取出第三方协议的原始反馈。
原始数据透传没有 Channel 字段,默认会发送到当前设备侧所有 RS485 接口;如需指定透传目标通道,可以使用 AT+RS485RAWCH=<0~4>,其中 0 表示全部通道。
以宇树 GO-M8010-6 电机协议为例,宇树上位机发送到电机的控制帧通常以 FE EE 开头,电机返回的反馈帧通常以 FD EE 开头:
宇树电机控制帧示例:
FE EE 11 00 00 00 00 00 00 00 00 00 00 00 00 18 7C
宇树电机反馈帧示例:
FD EE ...
使用宇树原厂上位机前,先发送 AT+RS485RAW=1 开启 RS485 原始数据透传模式。开启后,可以把 SANPO 集成开发板的 USB CDC串口当作普通 USB 转 RS485 串口使用,不需要把宇树协议重新封装成 SANPO RT 封装帧。
使用串口工具手动测试宇树协议时,应使用十六进制发送模式发送原始字节,例如 FE EE ...。不要把 FE EE 当作普通文本输入,也不要额外添加 SANPO RT 封装帧或 0x0D 0x0A 帧尾。
完成第三方上位机调试或参数设置后,建议发送 AT+RS485RAW=0 恢复 RT 封装帧模式;重新上电也会自动恢复为非透传模式。
如需在生产控制中固定到某一路 RS485,建议使用 SANPO RT 封装帧对宇树原始协议进行封装。
使用 SANPO RT 封装帧对宇树原始协议进行封装时,RT 封装帧只作为外层路由帧,宇树协议字节仍然原样放在 Data 字段里。固件转发到 RS485 总线时,会去掉 RT / Channel / Len / 帧尾,只把 Data 中的宇树原始字节发送到目标 RS485 通道。
例如,下面这条宇树 GO-M8010-6 控制帧原始字节长度为 17 字节:
FE EE 11 00 00 00 00 00 00 00 00 00 00 00 00 18 7C
如果要固定发送到 RS485-2,可以封装成 SANPO RT 封装帧:
52 54 02 11 FE EE 11 00 00 00 00 00 00 00 00 00 00 00 00 18 7C 0D 0A
其中 52 54 是 SANPO RT 封装帧的帧头,02 表示目标通道 RS485-2,11 表示后面有 17 字节宇树原始数据,末尾 0D 0A 是该封装帧的帧尾。RS485 总线上实际发出的仍然是中间的宇树原始数据:
FE EE 11 00 00 00 00 00 00 00 00 00 00 00 00 18 7C
使用 SANPO RT 封装帧的好处是:每一帧都能明确指定 RS485 通道;同一个 USB CDC串口可以同时管理多路 RS485;第三方协议本身不需要修改,只是在外层增加 SANPO 路由信息。RS485 设备返回数据时,固件也会用 SANPO RT 封装帧返回,并通过 Channel 字段标明反馈来自哪一路 RS485。