SANPO USB 转 CAN
SANPO USB 转 CAN 适合在 Windows 或 Linux 上使用串口程序控制经典 CAN 设备。上位机只需在 CAN ID 和数据外加入接口编号等信息,开发板会完成 USB 串口与 CAN 总线之间的转换。
建议使用 V47 或更新的 V4 固件。如果在 Linux 上希望直接使用 can0、cansend、candump 或 python-can,请参考 SocketCAN。
连接和准备
开发板连接电脑后,通常会出现两个 USB 串口。其中一个控制 CAN-1 和 CAN-2,另一个控制 CAN-3 和 CAN-4。操作系统分配的 COM 或 /dev/ttyACM* 编号不一定与开发板丝印顺序一致,首次使用时建议只连接一个 CAN 设备进行确认。
在串口软件或程序中打开对应的 USB 串口。
将串口波特率设置为与 CAN 设备一致的值。出厂默认为 1 Mbps。
按文本发送
AT+ET,并以CRLF结尾。返回OK后即可使用本页定义的报文格式。使用十六进制或二进制方式发送 CAN 报文。
支持的 CAN 波特率为 100000、125000、250000、500000 和 1000000。打开 USB 串口时选择的波特率,会同时用于该串口对应的两路 CAN。
选择 CAN 接口
当前 USB 串口对应的接口 |
Channel |
发送目标 |
|---|---|---|
CAN-1、CAN-2 |
|
CAN-1 |
CAN-1、CAN-2 |
|
CAN-2 |
CAN-3、CAN-4 |
|
CAN-3 |
CAN-3、CAN-4 |
|
CAN-4 |
任意一个 USB 串口 |
|
同时发送到当前串口对应的两路 CAN |
接收报文中的 Channel 使用当前 USB 串口内的顺序:0x01 表示第一路,0x02 表示第二路。因此,使用另一个 USB 串口时,CAN-3 和 CAN-4 的回包 Channel 也会显示为 0x01 和 0x02。
CAN 扩展帧
发送和接收使用相同格式:
字段 |
长度 |
说明 |
|---|---|---|
帧头 |
2 字节 |
固定为 |
Channel |
1 字节 |
CAN 接口编号 |
CAN ID |
4 字节 |
29 位扩展帧 ID,高字节在前 |
数据长度 |
1 字节 |
|
CAN 数据 |
0~8 字节 |
实际数据 |
帧尾 |
2 字节 |
固定为 |
例如,向 Channel 1、扩展帧 ID 0x0000FD01 发送 8 字节数据:
45 54 01 00 00 FD 01 08 01 00 00 00 00 00 00 00 0D 0A
CAN 标准帧
发送和接收使用相同格式:
字段 |
长度 |
说明 |
|---|---|---|
帧头 |
2 字节 |
固定为 |
Channel |
1 字节 |
CAN 接口编号 |
保留字节 |
2 字节 |
固定为 |
CAN ID |
2 字节 |
11 位标准帧 ID,高字节在前 |
数据长度 |
1 字节 |
|
CAN 数据 |
0~8 字节 |
实际数据 |
帧尾 |
2 字节 |
固定为 |
例如,向 Channel 1、标准帧 ID 0x142 发送 4 字节数据:
53 54 01 00 00 01 42 04 11 22 33 44 0D 0A
保存默认 CAN 波特率
如果希望开发板上电后自动使用指定波特率,可以按文本发送:
AT+SETCAN=1000000\r\n
设置成功后返回 OK\r\n,并在重新上电后继续生效。串口软件下次打开端口时,会再次按软件中选择的波特率配置 CAN,因此两处设置应保持一致。
CyberGear 示例
Windows:
python usb2can_cybergear_sine_demo_v4.py --port COM8 --motors 1 --channel 1
Linux:
sudo python3 usb2can_cybergear_sine_demo_v4.py --port /dev/ttyACM0 --motors 1 --channel 1
请根据实际串口、CAN 接口和电机 ID 修改参数。示例默认使用 1 Mbps。
常见问题
现象 |
处理方法 |
|---|---|
找不到 USB 串口 |
检查 USB 线、驱动和接口,然后重新拔插开发板 |
不确定串口对应哪两路 CAN |
只连接一个设备,分别使用两个 USB 串口发送测试报文 |
发送后设备没有回复 |
检查串口与 CAN 波特率、Channel、CAN ID、终端电阻、总线接线和设备供电 |
报文被发到了两路 CAN |
Channel 为 |
使用其他软件后回包格式发生变化 |
按文本发送 |
串口提示被占用 |
关闭其他串口软件或上位机程序,再重新打开端口 |