SocketCAN

SocketCAN 适合在 Linux 电脑、Jetson 或树莓派上直接控制 CAN 设备。开发板通过 USB 接入后,Linux 会将 CAN 接口显示为 can0can1can2can3 网络接口,可以直接使用 can-utilspython-can 或其他 SocketCAN 软件例如CANgaroo。

请使用 V4.6 或更新版本的固件。SocketCAN 只支持 CAN 设备;RS485 设备请参考 RS485 原始数据透传

连接和识别设备

  1. 通过 USB 将开发板连接到 Linux 主机。

  2. 将电机连接到开发板的 CAN 接口,然后开发板XT60电源接口接入电源,给电机供电。

  3. 安装 CAN 工具并加载驱动:

sudo apt update
sudo apt install can-utils
sudo modprobe gs_usb

查看当前识别到的 CAN 接口:

ip link show type can

开发板通常会显示 4 个 canX 接口。Linux 分配的 can0can1can2can3 不一定按开发板丝印顺序排列,控制电机前应先确认每个 canX 对应的物理 CAN 接口。

配置 CAN 接口

以将 can0 配置为 1 Mbps 为例:

sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up

请将波特率设置为与电机一致的值。该设置只对当前 Linux 系统中的接口生效;设备重新上电、拔插或主机重启后,需要重新配置。

查看接口状态和波特率:

ip -details link show can0

如需将 4 个接口全部配置为 1 Mbps,可以执行:

for iface in can0 can1 can2 can3; do
  sudo ip link set "$iface" down
  sudo ip link set "$iface" type can bitrate 1000000
  sudo ip link set "$iface" up
done

收发 CAN 报文

在第一个终端中监听 can0

candump can0

在第二个终端中发送标准帧:

cansend can0 123#11223344

发送扩展帧:

cansend can0 0000FD01#0102030405060708

cansend 发送成功时通常不输出信息。如果电机或其他 CAN 设备返回数据,candump 会显示接口名、CAN ID 和数据内容。电机是否响应取决于它的协议、ID 和当前状态,不是所有测试报文都会产生回复。

查看收发数量和错误计数:

ip -s -details link show can0

CyberGear 电机示例

下载 CyberGear SocketCAN 示例程序 后,可以使用以下命令控制 can0 上 ID 为 1 的电机:

sudo python3 socketcan_cybergear_demo_v6.py \
  --setup-links \
  --motor-map "can0:1"

--setup-links 会自动启用命令中使用的 CAN 接口,默认波特率为 1 Mbps。使用多个接口和电机时,可以按下列格式填写:

--motor-map "can0:1,2,3;can1:4,5,6"

例如 can0:1,2,3 表示 can0 连接了 ID 为 1、2、3 的电机。运行前请根据实际接线修改接口名和电机 ID。

常见问题

现象

处理方法

找不到 canX

确认固件为 V4.6 或更新版本,执行 sudo modprobe gs_usb,然后重新拔插 USB

RTNETLINK answers: Device or resource busy

先执行 sudo ip link set can0 down,再设置波特率

Network is down

执行 sudo ip link set can0 up

能发送但电机没有回复

检查 canX 与物理接口的对应关系、电机 ID、波特率、总线接线和电机供电

No buffer space available 或错误计数持续增加

检查总线接线、波特率和终端电阻;排除问题后将接口设为 down 再重新启用