# SocketCAN(gs_usb) V4.6 及以后固件支持 `SocketCAN(gs_usb)`。通过 USB CDC串口工具发送 `AT+VER` 查询版本时,V4.6 固件返回 `V46`。使用串口工具发送 `AT+` 指令时,请将发送结束符设置为 `CRLF`。在 Linux 主机通过 USB 接入开发板后,系统会通过内核 `gs_usb` 驱动生成 `canX` 网络接口。用户可以直接使用 `ip`、`cansend`、`candump`、`python-can` 等标准 SocketCAN 工具收发经典 CAN 报文。 SocketCAN 是 Linux 下的 CAN 网络接口使用方式,不使用 SANPO USB CDC串口协议中的 `ST / ET` 自定义帧头。如果需要使用 SANPO Studio、原有 USB 串口 Python 示例或电机原厂串口调试软件,请参考 [USB 转 CAN](usb_can)。 ## 功能支持 | 功能 | 支持情况 | | --- | --- | | 经典 CAN 标准帧 | 支持 | | 经典 CAN 扩展帧 | 支持 | | 经典 CAN 远程帧 | 支持 | | RS485 | 不通过 SocketCAN 使用 | RS485 仍通过 USB CDC串口协议或 SPI 协议使用,请参考 [USB 转 RS485](usb_rs485) 和 [SPI 转 RS485](spi_rs485)。 ## 接口说明 SANPO 集成开发板包含两颗 STM32F407 芯片,每颗芯片提供 2 路 CAN 接口。通过 USB 接入 Linux 后,会枚举出 4 个 `canX` 接口。 Linux 分配的 `can0`、`can1`、`can2`、`can3` 顺序由主机枚举顺序决定。正式使用前建议先确认 `canX` 与开发板物理 CAN 接口的对应关系。 支持 SocketCAN 的 V4 固件使用 USB 复合设备方式枚举,因此 Linux 上通常会同时出现 `canX` 网络接口和 `/dev/ttyACM*` USB CDC串口。`canX` 用于 SocketCAN,`/dev/ttyACM*` 仍可用于原有 USB CDC串口协议。 查看当前 CAN 接口: ```bash ip link show type can ``` 查看接口详细信息: ```bash ip -details link show can0 ``` 查看某个 `canX` 对应的 USB 设备路径: ```bash readlink -f /sys/class/net/can0/device udevadm info -q property -p "$(readlink -f /sys/class/net/can0/device)" ``` 如果系统中同时接入多个 SocketCAN 设备,建议在 Linux 上根据 USB 物理端口或设备序列号配置 `udev` 规则,将动态的 `can0`、`can1` 等名称固定为业务中更容易识别的名称。 ## Linux 使用步骤 安装常用 CAN 工具: ```bash sudo apt install can-utils ``` 加载 `gs_usb` 驱动: ```bash sudo modprobe gs_usb ``` 配置 `can0` 为 1 Mbps 经典 CAN: ```bash sudo ip link set can0 down sudo ip link set can0 type can bitrate 1000000 sudo ip link set can0 up ``` 发送标准帧: ```bash cansend can0 123#11223344 ``` 发送扩展帧: ```bash cansend can0 0000FD01#0102030405060708 ``` 接收报文: ```bash candump can0 ``` 查看接口状态和收发统计: ```bash ip -s -details link show can0 ``` ## 开发样例 - SocketCAN 控制小米 CyberGear 电机示例程序(Python 版本):socketcan_cybergear_demo_v6.py Ubuntu 下可以使用以下命令运行示例: ```bash sudo python3 socketcan_cybergear_demo_v6.py \ --setup-links \ --motor-map "can2:1,2,3;can3:4,5,6;can0:7,8,9;can1:10,11,12" ``` 其中 `can0`、`can1`、`can2`、`can3` 是 Linux 枚举出来的 SocketCAN 网络接口名,不一定与开发板丝印或物理 CAN 接口顺序固定对应。正式运行前,应先确认每个 `canX` 对应的实际物理接口和接入的电机 ID,再按现场接线修改 `--motor-map`。例如 `can2:1,2,3` 表示当前 Linux 系统中的 `can2` 接口连接了 ID 为 1、2、3 的电机。 `--setup-links` 会在打开 SocketCAN 套接字前配置命令中涉及的 `canX` 接口,默认波特率为 1 Mbps;如需使用其他波特率,可同时指定 `--bitrate`。 ## 波特率配置 SocketCAN 的波特率由 Linux 主机通过 `ip link set` 配置,只对当前运行中的 `canX` 接口生效,不会写入固件 Flash。设备重新上电、重新插拔或重新枚举后,需要由上位机重新配置。 修改波特率前,应先将接口设为 `down`: ```bash sudo ip link set can0 down sudo ip link set can0 type can bitrate 500000 sudo ip link set can0 up ``` 如果接口仍处于 `up` 状态时修改波特率,Linux 可能返回: ```text RTNETLINK answers: Device or resource busy ``` 此时先执行 `sudo ip link set can0 down`,再重新配置波特率。 如果需要同时配置 `can0~can3` 为 1 Mbps 经典 CAN,可以逐个接口执行: ```bash for i in 0 1 2 3; do sudo ip link set can$i down sudo ip link set can$i type can bitrate 1000000 sudo ip link set can$i up done ``` ## 与 USB CDC串口/SPI 的关系 SocketCAN、USB CDC串口协议和 SPI 协议是三种不同的上位机入口。它们最终访问的是开发板上的同一组物理 CAN 接口。 - SocketCAN 面向 Linux 标准 CAN 网络接口,适合使用 `can-utils`、`python-can` 或 Linux SocketCAN API 的场景。 - USB CDC串口协议面向 SANPO Studio、串口工具、原有 USB 串口 Python 示例和部分电机原厂调试软件。 - SPI 协议面向 Jetson Nano、树莓派或其他主控板通过 SPI 与开发板高速通信的场景。 正式控制同一路物理 CAN 总线时,建议选择其中一种入口发送控制帧。若同时使用多个入口,需要确保波特率配置一致,并避免不同上位机程序同时向同一 CAN 总线发送互相冲突的控制命令。