Skip to content

Usb serial devices, make symlinks so we don't need to know device

I had a little problem, I always have a TTY Usb serial adapter plugged in. I use this to program and debug avr micro-controllers. Lately I have started using NodeMCU boards. If I leave these plugged in when I shutdown my computer and boot it back up the usb devices are often swapped.

To solve this, I created some udev rules.

Plug in each device and check the dmesg output for the usb device information for idVendor, idProduct, For a nodemcu it will be like this (probably identical).

[ 3299.113934] usb 1-7: new full-speed USB device number 5 using xhci_hcd
[ 3299.364185] usb 1-7: New USB device found, idVendor=1a86, idProduct=7523
[ 3299.364189] usb 1-7: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 3299.364192] usb 1-7: Product: USB2.0-Serial
[ 3299.368112] ch341 1-7:1.0: ch341-uart converter detected
[ 3299.379429] usb 1-7: ch341-uart converter now attached to ttyUSB0

For the device I always leave plugged in, I also need the serial number. This is also an alternate way of getting the above information.

> udevadm info --name=/dev/ttyUSB1 --attribute-walk | grep idProduct | head -n 1 -
ATTRS{idProduct}=="2303"
> udevadm info --name=/dev/ttyUSB1 --attribute-walk | grep idVendor | head -n 1 -
ATTRS{idVendor}=="067b"
> udevadm info --name=/dev/ttyUSB1 --attribute-walk | grep serial
SUBSYSTEMS=="usb-serial"
ATTRS{serial}=="0000:09:00.3"

Now create a file in "/etc/udev/rules.d" call it "99-usb-serial.rules"

Add lines for each usb device, this is my file, You can match with above to get the correct values.

SUBSYSTEM=="tty", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", ATTRS{serial}=="0000:09:00.3", SYMLINK+="usbserial"
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="nodemcu"

Now, when the usb devices are connected my adapter that is always plugged in has a symlink created called /dev/usbserial which will point to the tty device, and any node mcu that I plugin gets the symlink /dev/nodemcu which points to its serial device. The symlinks can be used instead of the /dev/ttyUSB devices without having to know which device it is.