Fixing the Error "Serial connection closed" on my ender 3 - Missing /dev/serial/by-id
Fixing my Ender 3 (Again)
Today I needed to start a print (quite urgently). However, the tech gods decided: Not today
Since I am running Klipper, I need to restart the firmware after powering the ender3 on. Thats usually no problem. However, today the screen stayed blank.
My initial thought was, that the firmware was somehow broken. I didn’t have an explanation for that, but I tried reflashing the firmware with the newest version of klipper. Well, would it have been that easy, there is no way that I would have written this.
The screen was still blank.
A look into the kipper log file revealed another error message:
'Error: Serial connection closed'
I found out, that the path I use for the printer /dev/serial/by-id/<printer-id-here
was suddenly missing. Since I needed the print to start as fast as possible, I simply tried other paths (/dev/ttyUSB0
and /dev/serial/by-path/...
after verifying them). Still broken.
Solution
The solution that worked was quite simple: An update somehow broke the by-id
directory. LordOfTheSnow on reddit provided a udev rule, that fixes the problem. Thank you so much for that!
The main purpose of this post: Keep this available for me, should this ever happen again.
/usr/lib/udev/rules.d/60-serial.rules
# do not edit this file, it will be overwritten on update
ACTION=="remove", GOTO="serial_end"
SUBSYSTEM!="tty", GOTO="serial_end"
SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}"
# We already ran the hwdb builtin for devices with MODALIAS in 50-default.rules.
# Let's cover the remaining case here, where we walk up the tree to find a node with $MODALIAS.
ENV{MODALIAS}=="", SUBSYSTEMS=="pci", IMPORT{builtin}="hwdb --subsystem=pci"
# /dev/serial/by-path/, /dev/serial/by-id/ for USB devices
KERNEL!="ttyUSB[0-9]*|ttyACM[0-9]*", GOTO="serial_end"
SUBSYSTEMS=="usb-serial", ENV{.ID_PORT}="$attr{port_number}"
IMPORT{builtin}="path_id"
ENV{ID_PATH}=="?*", ENV{.ID_PORT}=="", SYMLINK+="serial/by-path/$env{ID_PATH}"
ENV{ID_PATH}=="?*", ENV{.ID_PORT}=="?*", SYMLINK+="serial/by-path/$env{ID_PATH}-port$env{.ID_PORT}"
IMPORT{builtin}="usb_id"
SUBSYSTEMS=="usb", ENV{ID_BUS}="usb"
ENV{ID_USB_INTERFACE_NUM}=="", GOTO="serial_end"
ENV{.ID_PORT}=="", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_USB_SERIAL}-if$env{ID_USB_INTERFACE_NUM}"
ENV{.ID_PORT}=="?*", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_USB_SERIAL}-if$env{ID_USB_INTERFACE_NUM}-port$env{.ID_PORT}"
LABEL="serial_end"
afterwards run
sudo udevadm control --reload-rules && sudo udevadm trigger
Afterwards, the printer works again. Why does this always happen when I’m stressed.