klipper下位机MCU丢失
最近我得打印机老是出现下面这个问题
Lost communication with MCU ‘mcu’
Once the underlying issue is corrected, use the
“FIRMWARE_RESTART” command to reset the firmware, reload the
config, and restart the host software.
Printer is shutdown
于是就去寻找一下问题得原因。
原因
很多事情看起来是一个问题,但是背后有可能是两个,甚至三个导致的,这个问题得例子就很正常。
首先我登录ssh后台,使用dmesg -T查看后台日志。发现了两个问题:
[Sat Jan 24 23:17:23 2026] usb 1-1: Product: USB2.0-Serial
[Sat Jan 24 23:17:23 2026] ch341 1-1:1.0: ch341-uart converter detected
[Sat Jan 24 23:17:23 2026] usb 1-1: ch341-uart converter now attached to ttyUSB1
[Sat Jan 24 23:42:35 2026] meson_clk_pll_set_rate: pll did not lock, trying to restore old rate 6000000000
[Sat Jan 24 23:58:27 2026] meson_clk_pll_set_rate: pll did not lock, trying to restore old rate 3600000000
[Sun Jan 25 00:00:54 2026] systemd-journald[694]: Received client request to flush runtime journal.
[Sun Jan 25 00:00:54 2026] systemd-journald[694]: Received client request to relinquish /var/log/journal/42c060c5d3b155dcbd2083e667f7a69e access.
[Sun Jan 25 00:10:54 2026] meson_clk_pll_set_rate: pll did not lock, trying to restore old rate 6000000000
[Sun Jan 25 01:04:55 2026] meson_clk_pll_set_rate: pll did not lock, trying to restore old rate 3408000000
[Sun Jan 25 01:14:36 2026] meson_clk_pll_set_rate: pll did not lock, trying to restore old rate 6000000000
[Sun Jan 25 01:35:02 2026] meson_clk_pll_set_rate: pll did not lock, trying to restore old rate 3408000000
[Sun Jan 25 01:36:58 2026] usb 1-1: USB disconnect, device number 28
[Sun Jan 25 01:36:58 2026] ch341-uart ttyUSB1: ch341-uart converter now disconnected from ttyUSB1
[Sun Jan 25 01:36:58 2026] ch341 1-1:1.0: device disconnected
[Sun Jan 25 01:36:58 2026] usb 1-1: new full-speed USB device number 29 using xhci-hcd
[Sun Jan 25 01:36:58 2026] usb 1-1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
[Sun Jan 25 01:36:58 2026] usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[Sun Jan 25 01:36:58 2026] usb 1-1: Product: USB2.0-Serial
[Sun Jan 25 01:36:58 2026] ch341 1-1:1.0: ch341-uart converter detected
[Sun Jan 25 01:36:58 2026] usb 1-1: ch341-uart converter now attached to ttyUSB1
[Sun Jan 25 01:37:19 2026] meson_clk_pll_set_rate: pll did not lock, trying to restore old rate 6000000000
[Sun Jan 25 01:44:02 2026] meson_clk_pll_set_rate: pll did not lock, trying to restore old rate 6000000000
[Sun Jan 25 02:09:52 2026] meson_clk_pll_set_rate: pll did not lock, trying to restore old rate 6000000000
[Sun Jan 25 02:52:16 2026] usb 1-1: USB disconnect, device number 29
[Sun Jan 25 02:52:16 2026] ch341-uart ttyUSB1: ch341-uart converter now disconnected from ttyUSB1
[Sun Jan 25 02:52:16 2026] ch341 1-1:1.0: device disconnected
[Sun Jan 25 02:52:17 2026] usb 1-1: new full-speed USB device number 30 using xhci-hcd
[Sun Jan 25 02:52:17 2026] usb 1-1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
[Sun Jan 25 02:52:17 2026] usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[Sun Jan 25 02:52:17 2026] usb 1-1: Product: USB2.0-Serial
[Sun Jan 25 02:52:17 2026] ch341 1-1:1.0: ch341-uart converter detected
[Sun Jan 25 02:52:17 2026] usb 1-1: ch341-uart converter now attached to ttyUSB1
从代码可以看出来:meson_clk_pll_set_rate: pll did not lock和无缘无故得USB断开,有时候这两者顺序发生,但是两者好像又没有明显的前后因果关系。
meson_clk_pll_set_rate: pll did not lock这个问题我查询了下,有可能是供电不足或者频率过载导致的,我确定了我得供电没问题,于是就限制了我得cpu频率上限,降低了klipper的波特率。
然后就变成了另外一个问题:
[Mon Jan 26 09:21:53 2026] ch341-uart ttyUSB0: usb_serial_generic_write_bulk_callback - urb stopped: -32
[Mon Jan 26 09:21:53 2026] ch341-uart ttyUSB0: usb_serial_generic_write_bulk_callback - urb stopped: -32
这个错误代码-32在 Linux 内核中代表EPIPE(Broken pipe)。
在你的 USB 串口上下文(CH341)中,这个错误通常意味着 硬件层面的通讯链路彻底崩溃了。
URB (USB Request Block):是 Linux 内核用来与 USB 设备沟通的“数据包”。
Stopped (停止):内核尝试从串口读取数据(read_bulk_callback),但失败了。
-32 (Broken pipe):这是一个底层的握手失败信号。它表示 USB 控制器尝试访问设备,但设备没有回应(Stalled),或者物理连接已经处于非活动状态。
简单来说:你的 CH341 芯片在这一瞬间“挂掉”或“消失”了,内核无法再从它那里读到任何数据。
至于USB无缘无故断连接的问题,我查询了GitHub的issues,发现了这是Linux系统问题,主要是我得USB口是2.0的,但是系统是配置3.0下兼容的,导致不稳定,具体可以查看说明,解决方法简单的就是加一个USB-hub的硬件,否则你需要自己手动修改内核,我在前面加了一个5口的USB拓展以后就没在出现断连接。修改内核的话稳定性和复杂度都不如你直接5块钱包邮的USB拓展。
这下我的问题就是时钟频率过高,后续变为了USB环路失效。
在我经过一番查找之后,发现,这是一个问题的变种,首先系统接收到错误的数据是会校正的,但是这需要cpu资源,于是在我没有限制CPU之前,CPU超载成为了问题,我限制之后纠错来不及导致硬件上失效。内核驱动尝试了几次重试后彻底放弃,抛出 -32 错误并强制断开设备。
解决方法
~~买一个带磁环的数据线,一般这种线都有屏蔽,能解决这个问题。~~最后发现是我打印机旁边有个冰箱,冰箱压缩机启动时候带来大量电磁干扰,这也解释了我为啥之前没搬到这个新位置的时候没有问题。搬到原理冰箱的位置即可。
总结
这就是一个很经典的一个错误带来的多个问题,本质是USB线在打印机复杂的电磁环境内受到影响,但是表现成了CPU超载,当你着手解决CPU问题后,才会出现USB环路失效的真正问题。
关键的问题是提出关键问题,在里面我一直找不到干扰的来源,以为是电机的干扰,后面发现确实不合理。如果电机干扰这么大,那么原来的机器就无法工作了,怎么可能正常工作。所以一个问题确定主要问题才是关键。