跳到主要内容

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 downCAN0 未启动或配置错误重新配置 CAN0 并重启
can.CanError: Failed to transmit: [Errno 105] No buffer space availableCAN 缓存不足或系统网络队列异常确认缓存为 1024,必要时重新配置 CAN0
mcu 'xxx': Invalid CAN uuidCAN UUID 填写错误或设备未在线重新搜索 UUID,检查线序、供电和终端电阻
Serial connection closedKlipper 已找到配置但连接中断检查 CAN 网络质量、线序、终端电阻和固件速率
Duplicate canbus_uuid多个 MCU 配置使用了同一个 CAN UUID重新搜索 UUID,确认每个 [mcu xxx] 唯一
Unknown canbus_uuid xxx配置中的 CAN UUID 不在当前网络搜索结果中注释对应 MCU 配置后重新搜索并填写
Can not update MCU 'xxx' config as it is shutdownCAN MCU 已先进入 shutdown,后续配置更新失败向上翻 klippy.log 找第一条掉线或 shutdown 根因

更多 Klipper 报错可参考 常见报错提示

CAN 通信报错排查

电磁干扰是常见根源

CAN 总线通信异常的很大一部分原因是电磁干扰(EMI)。3D 打印机内部的步进电机线、加热线、热床线在大电流工作时会产生强电磁场,如果 CAN 通信线(CANH/CANL)与这些强电线近距离平行走线,干扰信号会耦合到 CAN 总线上,导致:

  • 通信超时、MCU 间歇性掉线
  • CAN 设备随机离线、canbus_query.py 扫描不到
  • 归位过程中触发 Timer too closeCommunication 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。

解决方法

  1. 升级 Linux 内核至 v6.6.0 或更高版本
  2. 如果使用 candlelight USB-CAN 适配器,升级固件至 v2.0 或更高
  3. 如果使用 Klipper USB-to-CAN 桥接模式,确保桥接节点刷写 Klipper v0.12.0+ 固件。
  4. 如果 bytes_invalid 仍在增长,说明根本原因未解决,需继续排查内核版本和固件版本。
  5. 注意bytes_invalid 递增不是由接线或终端电阻等硬件问题引起的,只能通过更新软件/固件修复。

CAN 总线队列不足导致 Timer too close

报错信息:CAN 总线通信时出现 MCU 'xxx' shutdown: Timer too close

报错原因:Linux 内核为 CAN 网络接口设置的默认队列长度(qlen)通常为 10,对 Klipper 高频低延迟通信需求来说偏小。Klipper 官方示例常用 txqueuelen 128;FlyOS-FAST 预设为 1024,在节点较多或高负载场景下余量更大。

解决方法

  1. 检查当前 CAN 接口队列长度:
ip link show can0 | grep qlen
  1. 临时增大队列长度。普通系统可先测试 128,FLY 系统或多节点机器可使用 1024
sudo ip link set dev can0 qlen 128
# 或
sudo ip link set dev can0 qlen 1024
  1. 永久设置:在 /etc/network/interfaces.d/can0 中添加 txqueuelen 128txqueuelen 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 电阻。

  1. 确认 CAN 总线上有且仅有两个 120Ω 终端电阻,优先使用板载跳线帽、拨码开关或成品终端接口。
  2. 检查 CANH/CANL 接线是否牢固,插头是否完全插入。
  3. 请先断电再操作。使用万用表测量 CANH-CANL 之间电阻(正常约 60Ω)。
  4. 重新走线:将 CAN 通信线与强电线分开走线,保持至少 2-3cm 距离,避免平行。
  5. 确认屏蔽接地:屏蔽线仅在上位机侧接地,工具板侧悬空不接;不要自行拆卸电源或改动市电地线。
  6. 使用 candump 监控 CAN 总线流量,观察是否有大量错误帧(error frames)出现。
  7. 临时降低打印速度/加速度测试,如果问题消失,说明干扰与电机驱动强度正相关。

搜索不到 ID 的排查顺序

  1. 执行 ip -details link show can0,确认 CAN0 存在并处于可用状态。
  2. 确认工具板、主板固件 CAN 速率与上位机 CAN0 速率一致。
  3. 如果设备 ID 已写入 printer.cfg,先临时注释对应配置,再关机断电约 10 秒后重新上电搜索。
  4. 检查 CAN-H 与 CAN-L 是否接反、断线或接触不良。
  5. 确认 CAN 网络两端各有一个 120Ω 终端电阻,整机断电后测量 CAN-H 与 CAN-L 之间的阻值应约为 60Ω
  6. 确认工具板或主板已正常供电。
  7. 确认固件编译时选择了正确的通信方式。
  8. 若搜索结果显示 Application: CANBOOTApplication: Katapult,请先刷写 Klipper 固件后再搜索。

终端电阻规则

断电操作

调整终端电阻跳线帽、拨码开关或重新插拔 CAN 线前,请完全关闭打印机并断开电源供应。

设备类型终端电阻要求操作说明
CAN 工具板需要 120Ω 终端电阻通过板载跳线帽或拨码开关启用
主板 CAN 接口需要 120Ω 终端电阻通过板载跳线帽或拨码开关启用
UTOC 类转换模块通常已内置 120Ω 电阻无需再额外启用终端电阻

快速排查顺序

  1. 先看设备:执行 lsusb,确认能看到 1d50:606f
  2. 再看配置:执行 ip -details link show can0,确认 CAN0 存在、速率正确、缓存为 1024
  3. 最后看硬件:完全断电后测量 CAN-H 与 CAN-L,确认阻值约为 60Ω

全部检查后仍然异常时,可尝试更换 USB 线、CAN 线、UTOC 或 CAN 桥接设备交叉测试。

CAN 设备固件更新参考

本节用于已经能连接到 CAN 网络、且需要通过 CAN 更新主板或工具板固件的场景。不同产品的固件名称和编译方式不同,请先按对应产品教程编译好固件。

准备工作

  1. 按产品教程编译好新的固件。
  2. 确认可搜索到设备 CAN UUID,或已在 printer.cfg 中填写该设备的 canbus_uuid:
  3. 停止 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 提示,通常表示烧录成功。

Loading...

更新后操作

更新完成后重新启动 Klipper:

sudo systemctl start klipper

如果更新后无法连接,请重新搜索 CAN ID,并确认 printer.cfg 中的 canbus_uuid: 是否仍然正确。

最终检查清单

搜索不到 CAN ID 或 Klipper 无法连接 CAN 设备时,可按以下顺序快速核对:

  1. can0 可以被系统识别。
  2. bitrate 与固件编译时设置的 CAN 速率一致。
  3. qlentxqueuelen1024
  4. CAN-H 与 CAN-L 没有接反。
  5. CAN 总线两端终端电阻正确。
  6. 工具板或主板供电正常。
  7. 固件通信方式选择正确。
  8. printer.cfg 中使用的是实际搜索到的 canbus_uuid:
  9. 同一个 [mcu] 中没有同时启用 serial:canbus_uuid:
Loading...