Search code examples
linuxraspberry-piserial-portusbserial

Identify which USB device is /dev/ttyUSB0


I'm working with a Linux distribution (Raspbian) and I have two USB-Serial adapters which I'm connecting to the microcontroller. Whenever I connect both adapters, the serial ports "/dev/ttyUSB0" and "/dev/ttyUSB1" appear; here "/dev/ttyUSB0" is the adapter that was physically connected first (identified first by the system).

Now, I'm looking for a way to figure out which adapter is which in the event of a microcontroller restart. I.e., both adapters remained plugged into their USB ports and I can't physically unplug/replug to force which adapter is "USB0".

Basic research led me to these commands (pictures for reference):

ls /dev/ttyUSB* To list out the USB-serial ports that are active.

Enter image description here

lsusb To get more information about the USB buses and connected devices.

Enter image description here

Is there a way to relate these two results (or an alternative) to figure out what I need? For instance, in the pictures above "/dev/ttyUSB0" is "Bus 001 Device 008: ID 1a86:...", but how can I find that out through software (preferably using Python, but a shell script could work too)?


Solution

  • Since you mentioned that you want to do it from Python, pyudev has the following example code to access everything udev knows about a device identified by a device file:

    from pyudev import Context, Device
    context = Context()
    device = Devices.from_device_file(context, '/dev/sda')
    

    I believe that should work very nicely with /dev/ttyUSB0 as well.

    See https://pyudev.readthedocs.io/en/latest/api/pyudev.html#pyudev.Devices.from_device_file

    Once you have the device udev instance in Python, you can access device.attributes and device.properties to get a wealth of information including VID, PID, string descriptors, and so on. The documentation says that

    all well-known dictionary methods and operators (e.g. .keys(), .items(), in) are available to access device properties.