CAN 报错排查
本文用于处理 CAN 网络常见报错、通信异常排查以及搜索不到 CAN ID 时的排查流程。
适用场景:
- Klipper 出现 CAN0、CAN UUID 或 CAN 网络相关报错。
- CAN 设备间歇性离线或搜索不到。
- 需要排查 CAN
bytes_invalid、Timer too close 等问题。
若需配置 CAN0、搜索 CAN ID 或了解接线与终端电阻规则,请先参考 CAN 网络配置与 ID 搜索。
常见报错判断
| 报错 | 常见原因 | 处理方式 |
|---|---|---|
OSError: [Errno 19] No such device | 上位机找不到 CAN 设备 | 检查 UTOC、USB 线、CAN 桥接固件和供电 |
can.CanError: Failed to transmit: [Errno 100] Network is down | CAN0 未启动或配置错误 | 重新配置 CAN0 并重启 |
can.CanError: Failed to transmit: [Errno 105] No buffer space available | CAN 缓存不足或系统网络队列异常 | 确认缓存为 1024,必要时重新配置 CAN0 |
mcu 'xxx': Invalid CAN uuid | CAN UUID 填写错误或设备未在线 | 重新搜索 UUID,检查线序、供电和终端电阻 |
Serial connection closed | Klipper 已找到配置但连接中断 | 检查 CAN 网络质量、线序、终端电阻和固件速率 |
更多 Klipper 报错可参考 常见报错提示。
CAN 通信报错排查
CAN 总线通信异常的很大一部分原因是电磁干扰(EMI)。3D 打印机内部的步进电机线、加热线、热床线在大电流工作时会产生强电磁场,如果 CAN 通信线(CANH/CANL)与这些强电线近距离平行走线,干扰信号会耦合到 CAN 总线上,导致:
- 通信超时、MCU 间歇性掉线
- CAN 设备随机离线、
canbus_query.py扫描不到 - 归位过程中触发
Timer too close或Communication timeout - 打印过程中突然 shutdown,日志无明显硬件错误
排查干扰时,优先检查 CAN 线与强电线的走线布局、屏蔽层接地、终端电阻完整性。
CAN bytes_invalid 计数器持续增长
报错信息:klippy.log 中每秒统计行 Stats 出现 bytes_invalid 非零且持续增长。
报错原因:CAN 总线消息被重新排序(reordered messages),这是严重问题,会导致打印过程中任何阶段出现不稳定和随机错误。
已知原因:
- Linux 内核版本低于 v6.6.0,存在 gs_usb CAN 驱动重排序 Bug。
- 使用 candlelight 固件的 USB-CAN 适配器,固件版本低于 v2.0。
- Klipper USB-to-CAN 桥接模式节点固件低于 v0.12.0。
解决方法:
- 升级 Linux 内核至 v6.6.0 或更高版本。
- 如果使用 candlelight USB-CAN 适配器,升级固件至 v2.0 或更高。
- 如果使用 Klipper USB-to-CAN 桥接模式,确保桥接节点刷写 Klipper v0.12.0+ 固件。
- 如果
bytes_invalid仍在增长,说明根本原因未解决,需继续排查内核版本和固件版本。 - 注意:
bytes_invalid递增不是由接线或终端电阻等硬件问题引起的,只能通过更新软件/固件修复。
CAN 总线队列不足导致 Timer too close
报错信息:CAN 总线通信时出现 MCU 'xxx' shutdown: Timer too close。
报错原因:Linux 内核为 CAN 网络接口设置的默认队列长度(qlen)通常为 10,对 Klipper 高频低延迟通信需求来说偏小。Klipper 官方示例常用 txqueuelen 128;FlyOS-FAST 预设为 1024,在节点较多或高负载场景下余量更大。
解决方法:
- 检查当前 CAN 接口队列长度:
ip link show can0 | grep qlen
- 临时增大队列长度。普通系统可先测试
128,FLY 系统或多节点机器可使用1024:
sudo ip link set dev can0 qlen 128
# 或
sudo ip link set dev can0 qlen 1024
- 永久设置:在
/etc/network/interfaces.d/can0中添加txqueuelen 128或txqueuelen 1024参数;如果使用 systemd-networkd,则在.link文件中设置TxQueueLength=。
CAN 总线节点不响应
报错信息:CAN 设备突然离线,canbus_query.py 扫描不到设备。
常见原因:
- CAN 终端电阻缺失或不正确(CANH-CANL 之间必须有且仅有两个 120Ω 电阻)。
- CANH/CANL 接线松动、压接不良或插头松动。
- CAN 线未使用双绞屏蔽线,或与强电线平行走线导致电磁干扰(最常见也最隐蔽的原因)。
- USB-CAN 适配器供电异常。
干扰排查重点:
电磁干扰导致的 CAN 通信异常往往表现为"间歇性"和"随机性"——有时一切正常,有时突然掉线,断电重启后又恢复。排查时应重点关注:
- 走线布局:CAN 通信线是否与电机线、加热线、热床线在拖链中并排走线?高速 PWM 调制的电机驱动信号和加热器开关噪声是最强的干扰源。
- 屏蔽层接地:使用屏蔽线时,屏蔽层是否单端接地(仅在上位机侧接地)?双端接地会形成地环路,反而引入干扰。
- 终端电阻位置:终端电阻是否安装在 CAN 总线物理末端,并通过板载跳线帽、拨码开关或成品终端接口启用?
- CAN 线材规格:是否使用双绞线(绞距不超过几厘米)?平行线(非双绞)对共模干扰几乎没有抑制能力。
- 接地完整性:机器电源、外壳是否可靠接地?未接地的机器金属框架相当于一个大型天线,容易拾取环境噪声。
排查方法:
以下硬件排查必须在打印机完全断电并断开电源供应后进行:检查 CANH/CANL、重新走线、调整屏蔽层、启用/关闭终端电阻、测量 CANH-CANL 电阻。
- 确认 CAN 总线上有且仅有两个 120Ω 终端电阻,优先使用板载跳线帽、拨码开关或成品终端接口。
- 检查 CANH/CANL 接线是否牢固,插头是否完全插入。
- 请先断电再操作。使用万用表测量 CANH-CANL 之间电阻(正常约 60Ω)。
- 重新走线:将 CAN 通信线与强电线分开走线,保持至少 2-3cm 距离,避免平行。
- 确认屏蔽接地:屏蔽线仅在上位机侧接地,工具板侧悬空不接;不要自行拆卸电源或改动市电地线。
- 使用
candump监控 CAN 总线流量,观察是否有大量错误帧(error frames)出现。 - 临时降低打印速度/加速度测试,如果问题消失,说明干扰与电机驱动强度正相关。
搜索不到 ID 的排查顺序
- 执行
ip -details link show can0,确认 CAN0 存在并处于可用状态。 - 确认工具板、主板固件 CAN 速率与上位机 CAN0 速率一致。
- 如果设备 ID 已写入
printer.cfg,先临时注释对应配置,再关机断电约 10 秒后重新上电搜索。 - 检查 CAN-H 与 CAN-L 是否接反、断线或接触不良。
- 确认 CAN 网络两端各有一个
120Ω终端电阻,整机断电后测量 CAN-H 与 CAN-L 之间的阻值应约为60Ω。 - 确认工具板或主板已正常供电。
- 确认固件编译时选择了正确的通信方式。
- 若搜索结果显示
Application: CANBOOT或Application: Katapult,请先刷写 Klipper 固件后再搜索。
终端电阻规则
调整终端电阻跳线帽、拨码开关或重新插拔 CAN 线前,请完全关闭打印机并断开电源供应。
| 设备类型 | 终端电阻要求 | 操作说明 |
|---|---|---|
| CAN 工具板 | 需要 120Ω 终端电阻 | 通过板载跳线帽或拨码开关启用 |
| 主板 CAN 接口 | 需要 120Ω 终端电阻 | 通过板载跳线帽或拨码开关启用 |
| UTOC 类转换模块 | 通常已内置 120Ω 电阻 | 无需再额外启用终端电阻 |
快速排查顺序
- 先看设备:执行
lsusb,确认能看到1d50:606f。 - 再看配置:执行
ip -details link show can0,确认 CAN0 存在、速率正确、缓存为1024。 - 最后看硬件:完全断电后测量 CAN-H 与 CAN-L,确认阻值约为
60Ω。
全部检查后仍然异常时,可尝试更换 USB 线、CAN 线、UTOC 或 CAN 桥接设备交叉测试。
CAN 设备固件更新参考
本节用于已经能连接到 CAN 网络、且需要通过 CAN 更新主板或工具板固件的场景。不同产品的固件名称和编译方式不同,请先按对应产品教程编译好固件。
准备工作
- 按产品教程编译好新的固件。
- 确认可搜索到设备 CAN UUID,或已在
printer.cfg中填写该设备的canbus_uuid:。 - 停止 Klipper 服务:
sudo systemctl stop klipper
执行更新
将下方命令中的 <CAN_UUID> 替换为实际设备 ID。
根据系统版本选择对应指令。
- FlyOS-FAST 1.3.8 及以上版本 或 2026 年 4 月 9 日后更新过 Klipper 的系统:
python3 ~/klipper/lib/katapult/flashtool.py -u <CAN_UUID>
- 旧版本系统,即 FlyOS-FAST 1.3.8 之前,或 2026 年 4 月 9 日前未更新 Klipper 的系统:
python3 ~/klipper/lib/canboot/flash_can.py -u <CAN_UUID>
-u 后面必须有一个空格,然后再填写 CAN UUID。
出现 CAN Flash Success 提示,通常表示烧录成功。
更新后操作
更新完成后重新启动 Klipper:
sudo systemctl start klipper
如果更新后无法连接,请重新搜索 CAN ID,并确认 printer.cfg 中的 canbus_uuid: 是否仍然正确。
最终检查清单
搜索不到 CAN ID 或 Klipper 无法连接 CAN 设备时,可按以下顺序快速核对:
can0可以被系统识别。bitrate与固件编译时设置的 CAN 速率一致。qlen或txqueuelen为1024。- CAN-H 与 CAN-L 没有接反。
- CAN 总线两端终端电阻正确。
- 工具板或主板供电正常。
- 固件通信方式选择正确。
printer.cfg中使用的是实际搜索到的canbus_uuid:。- 同一个
[mcu]中没有同时启用serial:和canbus_uuid:。