Ubuntu20.04下slcand调用Canable报错:Inappropriate ioctl for device
解决Ubuntu 20.04下Canable设备使用slcand报错的问题
问题根源
你的Canable当前处于gs_usb原生CAN模式,而非串口转CAN模式:
- 该模式下设备会被识别为网络CAN接口(而非串口设备),因此不会生成
/dev/ttyUSB0或/dev/ttyACM0这类节点 - 你创建的udev规则指向的是整个USB设备节点(
usb_device类型),而slcand仅支持串口设备节点,所以会触发"Inappropriate ioctl for device"错误
两种解决方案(二选一)
方案1:直接使用原生gs_usb模式(推荐,无需slcand)
这种模式下Canable作为原生CAN接口工作,直接用can-utils工具操作:
- 确认内核模块加载:
lsmod | grep gs_usb # 如果无输出,手动加载模块 sudo modprobe gs_usb - 查看可用CAN接口:
ip link show # 你会看到类似`can0`的网络接口 - 配置并启动CAN接口(以1Mbps波特率为例):
sudo ip link set can0 up type can bitrate 1000000 # 若需开启回环测试,添加`loopback on`参数 # sudo ip link set can0 up type can bitrate 1000000 loopback on - 测试通信:
- 接收数据:
candump can0 - 发送数据:
cansend can0 123#1122334455667788
- 接收数据:
可选:给原生CAN接口设置固定名称(修改udev规则)
替换你之前的udev规则为以下内容(保存到/etc/udev/rules.d/99-canable.rules):
SUBSYSTEM=="net", ATTRS{serial}=="002900355934570820373433", NAME="can8"
执行sudo udevadm control --reload-rules && sudo udevadm trigger生效后,接口会固定为can8。
方案2:切换到串口转CAN模式(使用slcand)
若你必须使用slcand,需要将Canable固件切换为slcan模式:
- 进入DFU升级模式:
- 方法1:按住设备上的BOOT按键,同时插入USB
- 方法2:先关闭当前CAN接口,再触发DFU:
sudo ip link set can0 down sudo gs_usb_dfu
- 刷入slcan固件:
下载对应型号的slcan固件(文件名通常为slcan.bin),执行刷入命令:sudo dfu-util -d 1d50:606f -a 0 -D slcan.bin -R - 重新插拔设备,检查串口节点:
ls /dev/ttyACM* # 会看到类似`/dev/ttyACM0`的节点 - 修正udev规则(针对串口设备):
替换原规则为:
重载规则:SUBSYSTEM=="tty", ATTRS{serial}=="002900355934570820373433", SYMLINK+="cantest2"sudo udevadm control --reload-rules && sudo udevadm trigger - 使用slcand启动CAN接口:
之后同样可以用sudo slcand -o -c -s8 /dev/cantest2 can8 sudo ip link set can8 upcandump/cansend测试通信。
内容的提问来源于stack exchange,提问作者LeeJaeBong
相关产品推荐
相关产品推荐

