CAN 网络配置与 ID 搜索
本文用于处理 CAN 网络配置、CAN0 状态确认、CAN UUID 搜索以及常见 CAN 报错排查。
适用场景:
- 使用 UTOC 等 USB 转 CAN 模块连接 CAN 工具板。
- 使用已刷 USB 桥接 CAN 固件的主板连接 CAN 工具板。
- 主板或工具板已刷 CAN 固件,需要搜索 CAN UUID。
- Klipper 出现 CAN0、CAN UUID 或 CAN 网络相关报错。
使用前注意
- 将 UTOC 或已刷 CAN 桥接固件的主板通过 USB 连接至上位机。
- 请通过网络登录上位机后台,不要使用串口登录。
- FlyOS-FAST 系统已预设 CAN0 为 1M 速率、1024 缓存,一般无需手动配置 CAN0。
- 工具板、主板固件中的 CAN 速率必须与上位机 CAN0 速率一致。
- CAN 总线两端需要终端电阻,线序、电阻和供电问题都会导致搜索不到 ID。
CAN 接线与终端电阻
接线和终端电阻是 CAN 网络最常见的问题来源。
检查 CAN-H/CAN-L 线序、插头、压接、终端电阻跳线或拨码开关前,请完全关闭打印机并断开电源供应。不要在通电状态下拔插 CAN 线、调整跳线帽或测量电阻。
接线检查
- 断电后确认 CAN-H 接 CAN-H,CAN-L 接 CAN-L。
- 断电后检查 CAN 线、接插件和压线位置,确认没有断线、松动或接触不良。
- 如果使用 UTOC,请使用完好的 USB 数据线连接到上位机。
- 如果使用 USB 桥接 CAN 主板,请确认该主板已经刷写 USB 桥接 CAN 固件。
- 重新装好线束和外壳后再上电,确认 CAN 设备是否被系统识别。
终端电阻检查
CAN 总线两端各需要一个 120Ω 终端电阻。整机完全断电后,使用万用表测量 CAN-H 与 CAN-L 之间的阻值。
| 测量值 | 判断 |
|---|---|
约 60Ω | 正常,两端终端电阻已正确连接 |
约 120Ω | 通常只有一端有终端电阻,或者断线 |
约 40Ω | 可能有多余终端电阻,请检查中间节点 |
约 140Ω | 可能存在 CAN-H / CAN-L 接反或线路异常 |
测量终端电阻必须在完全断电状态下进行。未完全断电时操作可能导致读数不准,也可能损坏设备。
检查上位机是否支持 CAN
FLY 上位机可跳过此步骤。
执行以下命令检测内核 CAN 支持:
sudo modprobe can && echo "内核支持 CAN" || echo "内核不支持 CAN"
若显示 内核支持 CAN,可继续配置。若显示不支持,建议先更换支持 SocketCAN 的系统镜像。
检查 CAN 设备是否被识别
配置或搜索 CAN ID 前,建议先确认上位机已经识别到 UTOC 或 USB 桥接 CAN 设备。
执行:
lsusb
结果判断:
- 看到
1d50:606f:设备已被系统识别,可继续配置或搜索 CAN ID。 - 提示找不到
lsusb:请先安装usbutils。 - 没有看到
1d50:606f:检查 USB 线、UTOC、USB 桥接 CAN 固件和供电。 - 出现多个
1d50:606f:建议只保留一个 CAN 桥接设备,避免同时接入多个 CAN0 来源。
安装 usbutils:
sudo apt-get update
sudo apt-get install usbutils
只有系统识别到 CAN 桥接设备后,后续 CAN0 配置和 CAN ID 搜索才有意义。
配置 CAN0
此操作会覆盖原有 CAN0 配置,完成后需要重启系统。FlyOS-FAST 系统无需执行本步骤。
判断网络管理方式
不同系统使用的网络管理方式不同,配置 CAN0 前应先确认当前系统由谁管理网络。不要同时使用多套方式配置同一个 can0,否则可能出现配置不生效、重启后丢失或 CAN0 状态异常。
执行以下命令查看常见网络服务状态:
systemctl is-active NetworkManager
systemctl is-active systemd-networkd
systemctl is-active networking
也可以继续查看配置文件和设备状态:
ls /etc/network/interfaces /etc/network/interfaces.d/ 2>/dev/null
networkctl list 2>/dev/null
nmcli device status 2>/dev/null
根据结果选择配置方式:
| 判断结果 | 说明 | 建议选择 |
|---|---|---|
networking 显示 active,并且存在 /etc/network/interfaces.d/ | 常见于 Debian、Armbian 等系统 | 使用 ifupdown |
systemd-networkd 显示 active,networkctl list 能看到网络设备 | 网络由 systemd-networkd 管理 | 使用 systemd-networkd |
NetworkManager 显示 active,nmcli device status 能看到网络设备 | 网络由 NetworkManager 管理 | 不要直接混用下面两种配置,优先按当前系统的 NetworkManager 方案处理 |
多个服务都显示 active | 系统可能存在混合网络管理 | 先确认哪个服务实际管理 can0,再选择对应方式 |
若无法判断当前系统使用哪种方式,建议先参考系统镜像或上位机厂商文档。FLY 上位机和 FlyOS-FAST 系统一般无需手动配置 CAN0。
写入 CAN0 配置
确认网络管理方式后,根据实际系统选择对应配置。
- ifupdown
- systemd-networkd
ifupdown
适用于使用 /etc/network/interfaces.d/ 管理网络的 Debian、Armbian 等系统。1M 速率配置如下:
sudo /bin/sh -c "cat > /etc/network/interfaces.d/can0" << EOF
allow-hotplug can0
iface can0 can static
bitrate 1000000
up ifconfig \$IFACE txqueuelen 1024
pre-up ip link set can0 type can bitrate 1000000
pre-up ip link set can0 txqueuelen 1024
EOF
如需 500K 速率,将上方命令中的 1000000 改为 500000 后再执行。
systemd-networkd
适用于使用 systemd-networkd 管理网络的系统。1M 速率配置如下:
创建网络配置文件:
sudo tee /etc/systemd/network/99-can.network > /dev/null <<'EOF'
[Match]
Name=can*
[CAN]
BitRate=1000000
RestartSec=100ms
EOF
创建链接配置文件:
sudo tee /etc/systemd/network/99-can.link > /dev/null <<'EOF'
[Match]
OriginalName=can*
[Link]
TxQueueLength=1024
EOF
如需 500K 速率,将 BitRate=1000000 改为 BitRate=500000。
配置完成后重启设备:
sudo reboot
确认 CAN0 状态
重启后执行:
ip -details link show can0
重点核对以下内容:
bitrate:CAN 通信速率,例如1000000表示 1M。qlen或txqueuelen:发送队列长度,建议为1024。
如果提示找不到 can0,可先执行:
ip link
lsusb
dmesg | grep -i can
常见原因:
- UTOC 未被系统识别,或 USB 线仅支持供电。
- 主板未刷写 USB 桥接 CAN 固件。
- CAN0 配置文件未生效,或系统未重启。
- 系统镜像不支持 SocketCAN。
搜索 CAN ID
搜索前请先确认设备处于可搜索状态:
- 如果该设备的 UUID 已写入
printer.cfg并被 Klipper 正常连接,搜索命令可能不会再次列出该设备。 - 搜索前可临时注释对应
[mcu]配置段,保存后重启 Klipper。 - 设备断电约 10 秒后重新上电,再执行搜索命令。
普通上位机执行:
~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0
FLY 上位机执行:
python3 ~/klipper/scripts/canbus_query.py can0
结果判断:
Application: Klipper:该 ID 可直接写入printer.cfg使用。Application: CANBOOT或Application: Katapult:设备仍处于引导程序,需要先刷写 Klipper 固件。- 搜索不到任何 ID:先按下方“搜索不到 ID 的排查顺序”检查 CAN0、线序、终端电阻、供电和固件通信方式。
CAN ID 填写方法
- 打开打印机网页界面,在左侧配置入口中找到
printer.cfg。 - 将搜索到的 UUID 填写到对应
[mcu]配置段的canbus_uuid:后。 - 使用 CAN 连接时,不要在同一个
[mcu]中同时保留serial:和canbus_uuid:。 - 保存并重启 Klipper。
CAN 固件填写示例:
[mcu]
canbus_uuid: xxxxxxxxxxxx
USB 固件使用 serial:,CAN 固件使用 canbus_uuid:。如果从 USB 固件改为 CAN 固件,需要删除或注释原来的 serial:。
文档中的 ID 均为示例。每块主板或工具板的 ID 都不相同,请填写实际搜索到的 ID。
CAN 报错排查:如果已正确配置 CAN0 和 CAN ID 但仍然出现通信异常,请参考 CAN 报错排查。