user709: If I have multiple Arduinos connected over USB to a Linux computer, and they show up as 

/tty/ACM0  
/tty/ACM1
/tty/ACM2

How can I identify which Arduino is which without connecting to them via serial connection? Is there a serial number or a unique id on the Arduino?
Thank you for your time.
Situation: Uno R3, Mega, Leonardo with /ttyACM[1,2,3]
lsusb output with devices in the order mentioned above:

...
Bus 001 Device 011: ID 2341:0043
Bus 001 Device 013: ID 2341:8036
...
Bus 001 Device 014: ID 2341:0042

lsusb -d vendor:device -vvv shows for each one
Uno

Bus 001 Device 014: ID 2341:0042
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            2 Communications
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x2341
  idProduct          0x0042
  bcdDevice            0.01
  iManufacturer           1 Arduino (www.arduino.cc)
  iProduct                2
  iSerial               220 55330313735351910141
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           62
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      1 AT-commands (v.25ter)
      iInterface              0
      CDC Header:
        bcdCDC               10.01
      CDC ACM:
        bmCapabilities       0x06
          sends break
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval             255
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)


Leonardo:
Bus 001 Device 013: ID 2341:8036
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x2341
  idProduct          0x8036
  bcdDevice            1.00
  iManufacturer           1 Arduino LLC
  iProduct                2 Arduino Leonardo
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          100
    bNumInterfaces          3
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         2
      bFunctionClass          2 Communications
      bFunctionSubClass       2 Abstract (modem)
      bFunctionProtocol       1 AT-commands (v.25ter)
      iFunction               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      0 None
      iInterface              0
      CDC Header:
        bcdCDC               1.10
      CDC Call Management:
        bmCapabilities       0x01
          call management
        bDataInterface          1
      CDC ACM:
        bmCapabilities       0x06
          sends break
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.01
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     101
          Report Descriptor: (length is 101)
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x02 ] 2
                            Mouse
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Local ): Usage, data= [ 0x01 ] 1
                            Pointer
            Item(Main  ): Collection, data= [ 0x00 ] 0
                            Physical
            Item(Global): Report ID, data= [ 0x01 ] 1
            Item(Global): Usage Page, data= [ 0x09 ] 9
                            Buttons
            Item(Local ): Usage Minimum, data= [ 0x01 ] 1
                            Button 1 (Primary)
            Item(Local ): Usage Maximum, data= [ 0x03 ] 3
                            Button 3 (Tertiary)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x01 ] 1
            Item(Global): Report Count, data= [ 0x03 ] 3
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x05 ] 5
            Item(Main  ): Input, data= [ 0x03 ] 3
                            Constant Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x30 ] 48
                            Direction-X
            Item(Local ): Usage, data= [ 0x31 ] 49
                            Direction-Y
            Item(Local ): Usage, data= [ 0x38 ] 56
                            Wheel
            Item(Global): Logical Minimum, data= [ 0x81 ] 129
            Item(Global): Logical Maximum, data= [ 0x7f ] 127
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x03 ] 3
            Item(Main  ): Input, data= [ 0x06 ] 6
                            Data Variable Relative No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Main  ): End Collection, data=none

            ......

      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)

And Mega256:
Bus 001 Device 014: ID 2341:0042
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            2 Communications
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x2341
  idProduct          0x0042
  bcdDevice            0.01
  iManufacturer           1 Arduino (www.arduino.cc)
  iProduct                2
  iSerial               220 55330313735351910141
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           62
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      1 AT-commands (v.25ter)
      iInterface              0
      CDC Header:
        bcdCDC               10.01
      CDC ACM:
        bmCapabilities       0x06
          sends break
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval             255
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)


user168: I'd be mighty tempted to identify some other way, like having the sketch itself respond to a special identify command, just to avoid USB's odd ways of identifying devices.

user59111: Overview

One way as ansi_lumen mentioned in his answer is to flash ftdi
chip EEPROM to have unique serial number which then could be
identified by UDEV rules.
But turns out it won't work on cheap chinese Arduinos which instead
of FTDI has CH340G chip which doesn't have EEPROM to store
unique ID (CH340B should work).
This answer suggests to write UDEV rule with special script
which asks Arduino to send its unique ID via serial. Problem with
that is that you need to modify Arduino sketch and in general it's
quite complex.

Identifying by port
So the easiest way I found was to use UDEV rules and identify Arduinos by the usb port (devpath)
so connecting Arduino to the same port (even in nested usb hubs) will create persistent name.
TLDR setup:
Modified version of this

Find Arduino idVendor and idProduct:

lsusb
You will get something like this:
...
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 124: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 123: ID 214b:7000  
Bus 003 Device 122: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 121: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 120: ID 1a40:0101 Terminus Technology Inc. Hub
...

By connecting/disconnecting Arduino find which one it is (I have 3 connected). We are looking for its ID. In my case "...ID 1a86:7523 QinHeng...". So idVendor=1a86, idProduct=7523

Create new UDEV rules file: 

sudo nano /etc/udev/rules.d/99-usb-serial.rules

Modify idVendor and idProduct values by what you found in previous step on copy paste it in the rules file we have created:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB-arduino%s{/devpath}"

Reload UDEV rules

sudo udevadm control --reload

Replug Arduinos and now it will have unique name. To test it type:

ls /dev/ttyUSB*

Which will output:
/dev/ttyUSB1  /dev/ttyUSB3  /dev/ttyUSB-arduino2.1  /dev/ttyUSB-arduino2.4
 /dev/ttyUSB2  /dev/ttyUSB4  /dev/ttyUSB-arduino2.2  /dev/ttyUSB-arduino3
As you can see we still get /dev/ttyUSBx as before which are always changing depending which one was connected first. But now we also have /dev/ttyUSB-arduino{port} which are always the same for same port and only for Arduinos. To analyze what "..arduino2.4" means: 2 refers to the second port of laptop and 4 to the fourth port on usb hub.
To better see it type:
lsusb -t

Output:
...
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 1: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 1: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 84, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 85, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 2: Dev 86, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 3: Dev 87, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 4: Dev 88, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
    |__ Port 3: Dev 89, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
...

By connecting/disconnecting you can see which devices are on which ports

user4908: You can always make some kind of id print via serial in void setup(). After the certain board is connected it will send this id to your USB interface (which you are listening with some kind of daemon app on your linux box). Once you receive id you can map it to it's path
 'Arduino1' : '/dev/ttyACM0', 
 'Arduino2' : '/dev/ttyACM1',
 'Arduino3' : '/dev/ttyACM2'...etc
Be aware that when device is disconnected for some reason it can change it's physical path so you might have to remap all of them. For this case it might be good to write separate function ex: get_id() which you can call any time (not only on startup).

user6322: I would have used a script to make an alias under /dev/ and also set group and rights on it with udev like the other answers.
But if I didn't have udev I would pipe lsusb into grep or awk, like lsusb|grep -e "idProduct".
Anyway, with udev rules or with lsusb and grep to identify USB devices, use idVendor, idProduct and iSerial in Device descriptor part of lsusb to make the proper idenification.  The idVendor tells you the manufaturer, idProduct should indentify the product from the manufacturer but sometimes they use the same product id for more than one product.  Lastly, if needed, the iSerial should be a unique id for each example of that product.

user19013: This is quite easy! You have to customize the ftdi chips firmware and add an udev rule:
First, get ftdi_eeprom via apt-get or from the sources. Identify your device via lsusb and get the id:

lsusb

Bus 001 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
....

Prepare a config and make sure, that vendor_id and product_id match. Customize the strings in the Strings section to get a unique id for your device. 

vendor_id=0x0403    # Vendor ID
product_id=0x6001   # Product ID

max_power=50        # Max. power consumption: value * 2 mA. Use 0 if self_powered = true.

###########
# Strings #
########### 
manufacturer="FTDI"     # Manufacturer
product="Arduino Nano"      # Product
serial="arduino1"       # Serial

###########
# Options #
###########
self_powered=false  # Turn this off for bus powered
remote_wakeup=false # Turn this on for remote wakeup feature
use_serial=true     # Use the serial number string

# Normally out don't have to change one of these flags
# BM_type_chip=true         # Newer chips are all BM type
in_is_isochronous=false     # In Endpoint is Isochronous
out_is_isochronous=false    # Out Endpoint is Isochronous
suspend_pull_downs=false    # Enable suspend pull downs for lower power
change_usb_version=false    # Change USB Version
usb_version=0x0200      # Only used when change_usb_version is enabled

########
# Misc #
########

filename="eeprom.old"   # Filename, leave empty to skip file writing
cbus0=RXLED#
cbus1=TXLED#

Dump the current ftdi-firmware:
ftdi_eeprom --read-eprom
This command creates ${pwd}/eeprom.old, which contains the current firmware on the ftdi. Backup this file before continuing, because during flash-eeprom the file gets rewritten. After the backup, flash the ftdi:
ftdi_eeprom --flash-eeprom myconfig.conf

Now, create an udev rule, like so
SUBSYSTEMS=="usb", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="$attr{serial}", OWNER="bananapi", GROUP="pi", MODE="0777"

in /etc/udev/rules.d/90-arduino-usb.rules and restart udev. 
service udev restart

Unplug and re-plug your device and try
ls -lah /dev/arduino1

Where arduino1 is the string defined under serial in the above .conf. 
See also: Risks of ftdi_eeprom? - TX always high after flashing

user490: You can add an alias for each. Then you know which is which. Here is a nice tutorial on how to set this up.
Here is a snippet that I wrote based on the tutorial. In the below example, I am using a FTDI RS232RL USB to Serial adapter, which I believe is what the Arduino uses too. 

In order to assign an alias to a USB-Serial device, we need to find some info on the device
Plug in the usb. This assumes you have already install the drivers for this use be device and the device is visible when typing:

lsusb

We are going to need the following
a.    The vendor id
b.    The product id
c.    The device serial number
To do this, it takes a little bit of hunting. All your devices log entries in '/var/log/messages'. 

Therefore we can read this file and find the correct USB:
grep "ftdi" /var/log/messages

You can also use "usb"

This is find all messages tagged with ftdi:
Next to ftdi_sio, there is a number like 1-1.2. This is the USB device

grep "usb 1-1.2" /var/log/messages
Or you can use:
dmesg | grep "usb 1-1.3"


This gives us all the info we need:



Now with the list of serial numbers in hand let’s create a UDEV ruleset that’ll make a nice symbolic link for each of these devices. UDEV rules are usually scattered into many files in /etc/udev/rules.d. Create a new file called 99-usb-serial.rules and put the following lines in there:

In this example my alias is called 'lcdbox'
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A601ERJJ", SYMLINK+="lcdbox"


SYMLINK is the name of your alias. In this case my alias is lcdbox.
Save the file and type
sudo udevadm control --reload-rules
Type
ls –l /dev/lcdbox

lrwxrwxrwx 1 root root 7 Jan  1  1970 /dev/lcdbox -> ttyUSB0

This shows that my lcdbox alias is mapped to ttyUSB0


user84: On Ubuntu 16.04 (and maybe previous versions or other distribs too), you can do:
> ls /dev/serial/by-id

which displays (on my box where an Arduino UNO is connected):
usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00

You can easily spot the Device ID 0043 (UNO) here.
This file is actually a link to /dev/ttyACM0 in my box.

user2973: Assuming your distro is using udev:
udevadm info --query=all --name=/dev/ttyACM0

You might need root privileges to run this(sudo / su). It will output a list of information like this:
P: /devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
N: ttyACM0
S: serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00
S: serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVLINKS=/dev/serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00 /dev/serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVNAME=/dev/ttyACM0
E: DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
E: ID_BUS=usb
E: ID_MM_CANDIDATE=1
E: ID_MODEL=LUFA_USB-RS232_Adapter
E: ID_MODEL_ENC=LUFA\x20USB-RS232\x20Adapter
E: ID_MODEL_FROM_DATABASE=Uno R3 (CDC ACM)
E: ID_MODEL_ID=0043
E: ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
E: ID_PATH_TAG=pci-0000_00_1d_2-usb-0_2_1_0
E: ID_REVISION=0001
E: ID_SERIAL=Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012
E: ID_SERIAL_SHORT=74133353537351403012
E: ID_TYPE=generic
E: ID_USB_DRIVER=cdc_acm
E: ID_USB_INTERFACES=:020201:0a0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Dean_Camera
E: ID_VENDOR_ENC=Dean\x20Camera
E: ID_VENDOR_FROM_DATABASE=Arduino SA
E: ID_VENDOR_ID=2341
E: MAJOR=166
E: MINOR=0
E: SUBSYSTEM=tty
E: UDEV_LOG=3
E: USEC_INITIALIZED=751387324986

This is for an Uno with modified firmware on the atmega16u2(usb to serial). The lines of interest are probably ID_MODEL_ID and ID_MODEL_FROM_DATABASE.

709: <p>If I have multiple Arduinos connected over USB to a Linux computer, and they show up as </p>

<ul>
<li>/tty/ACM0  </li>
<li>/tty/ACM1</li>
<li>/tty/ACM2</li>
</ul>

<p>How can I identify which Arduino is which <strong>without connecting to them via serial connection</strong>? Is there a serial number or a unique id on the Arduino?</p>

<p>Thank you for your time.</p>

<p>Situation: Uno R3, Mega, Leonardo with /ttyACM[1,2,3]</p>

<p>lsusb output with devices in the order mentioned above:</p>

<pre>
...
Bus 001 Device 011: ID 2341:0043
Bus 001 Device 013: ID 2341:8036
...
Bus 001 Device 014: ID 2341:0042
</pre>

<p>lsusb -d vendor:device -vvv shows for each one</p>

<p>Uno</p>

<pre>
Bus 001 Device 014: ID 2341:0042
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            2 Communications
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x2341
  idProduct          0x0042
  bcdDevice            0.01
  iManufacturer           1 Arduino (www.arduino.cc)
  iProduct                2
  iSerial               220 55330313735351910141
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           62
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      1 AT-commands (v.25ter)
      iInterface              0
      CDC Header:
        bcdCDC               10.01
      CDC ACM:
        bmCapabilities       0x06
          sends break
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval             255
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)

</pre>

<p>Leonardo:</p>

<pre>Bus 001 Device 013: ID 2341:8036
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x2341
  idProduct          0x8036
  bcdDevice            1.00
  iManufacturer           1 Arduino LLC
  iProduct                2 Arduino Leonardo
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          100
    bNumInterfaces          3
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         2
      bFunctionClass          2 Communications
      bFunctionSubClass       2 Abstract (modem)
      bFunctionProtocol       1 AT-commands (v.25ter)
      iFunction               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      0 None
      iInterface              0
      CDC Header:
        bcdCDC               1.10
      CDC Call Management:
        bmCapabilities       0x01
          call management
        bDataInterface          1
      CDC ACM:
        bmCapabilities       0x06
          sends break
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.01
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     101
          Report Descriptor: (length is 101)
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x02 ] 2
                            Mouse
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Local ): Usage, data= [ 0x01 ] 1
                            Pointer
            Item(Main  ): Collection, data= [ 0x00 ] 0
                            Physical
            Item(Global): Report ID, data= [ 0x01 ] 1
            Item(Global): Usage Page, data= [ 0x09 ] 9
                            Buttons
            Item(Local ): Usage Minimum, data= [ 0x01 ] 1
                            Button 1 (Primary)
            Item(Local ): Usage Maximum, data= [ 0x03 ] 3
                            Button 3 (Tertiary)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x01 ] 1
            Item(Global): Report Count, data= [ 0x03 ] 3
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x05 ] 5
            Item(Main  ): Input, data= [ 0x03 ] 3
                            Constant Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x30 ] 48
                            Direction-X
            Item(Local ): Usage, data= [ 0x31 ] 49
                            Direction-Y
            Item(Local ): Usage, data= [ 0x38 ] 56
                            Wheel
            Item(Global): Logical Minimum, data= [ 0x81 ] 129
            Item(Global): Logical Maximum, data= [ 0x7f ] 127
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x03 ] 3
            Item(Main  ): Input, data= [ 0x06 ] 6
                            Data Variable Relative No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Main  ): End Collection, data=none

            ......

      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)
</pre>

<p>And Mega256:</p>

<pre>Bus 001 Device 014: ID 2341:0042
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            2 Communications
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x2341
  idProduct          0x0042
  bcdDevice            0.01
  iManufacturer           1 Arduino (www.arduino.cc)
  iProduct                2
  iSerial               220 55330313735351910141
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           62
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      1 AT-commands (v.25ter)
      iInterface              0
      CDC Header:
        bcdCDC               10.01
      CDC ACM:
        bmCapabilities       0x06
          sends break
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval             255
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)
</pre>
 168: <p>I'd be mighty tempted to identify some other way, like having the sketch itself respond to a special identify command, just to avoid USB's odd ways of identifying devices.</p>
 59111: <h2>Overview</h2>

<ul>
<li><p>One way as ansi_lumen mentioned in his <a href="https://arduino.stackexchange.com/a/22323/59111">answer</a> is to flash ftdi
chip EEPROM to have unique serial number which then could be
identified by UDEV rules.</p>

<p>But turns out it <em>won't work on cheap chinese Arduinos</em> which instead
of FTDI has CH340G chip which <a href="https://arduino.stackexchange.com/a/31958">doesn't have EEPROM</a> to store
unique ID (<a href="https://arduino.stackexchange.com/a/61540/59111">CH340B should work</a>).</p></li>
<li>This <a href="https://arduino.stackexchange.com/a/31958/59111">answer suggests</a> to write UDEV rule with special script
which asks Arduino to send its unique ID via serial. Problem with
that is that you need to modify Arduino sketch and in general it's
quite complex.</li>
</ul>

<h2>Identifying by port</h2>

<p>So the <a href="https://stackoverflow.com/a/41535538/5031366">easiest way</a> I found was to use UDEV rules and identify Arduinos by the usb port (devpath)
so connecting Arduino to the same port (even in nested usb hubs) will create <a href="https://www.domoticz.com/wiki/PersistentUSBDevices" rel="nofollow noreferrer">persistent name</a>.</p>

<p><strong>TLDR setup:</strong></p>

<p>Modified version of <a href="https://www.domoticz.com/wiki/PersistentUSBDevices" rel="nofollow noreferrer">this</a></p>

<ol>
<li>Find Arduino idVendor and idProduct:</li>
</ol>

<p><code>lsusb</code></p>

<p>You will get something like this:</p>

<pre><code>...
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 124: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 123: ID 214b:7000  
Bus 003 Device 122: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 121: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 120: ID 1a40:0101 Terminus Technology Inc. Hub
...
</code></pre>

<p>By connecting/disconnecting Arduino find which one it is (I have 3 connected). We are looking for its ID. In my case "...ID 1a86:7523 QinHeng...". So idVendor=1a86, idProduct=7523</p>

<ol start="2">
<li>Create new UDEV rules file: </li>
</ol>

<p><code>sudo nano /etc/udev/rules.d/99-usb-serial.rules</code></p>

<ol start="3">
<li>Modify idVendor and idProduct values by what you found in previous step on copy paste it in the rules file we have created:</li>
</ol>

<p><code>SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB-arduino%s{/devpath}"</code></p>

<ol start="4">
<li>Reload UDEV rules</li>
</ol>

<p><code>sudo udevadm control --reload</code></p>

<ol start="5">
<li>Replug Arduinos and now it will have unique name. To test it type:</li>
</ol>

<p><code>ls /dev/ttyUSB*</code></p>

<hr>

<p>Which will output:</p>

<p><code>/dev/ttyUSB1  /dev/ttyUSB3  /dev/ttyUSB-arduino2.1  /dev/ttyUSB-arduino2.4
 /dev/ttyUSB2  /dev/ttyUSB4  /dev/ttyUSB-arduino2.2  /dev/ttyUSB-arduino3</code></p>

<p>As you can see we still get /dev/ttyUSBx as before which are always changing depending which one was connected first. But now we also have /dev/ttyUSB-arduino{port} which are always the same for same port and only for Arduinos. To analyze what "..arduino2.4" means: 2 refers to the second port of laptop and 4 to the fourth port on usb hub.</p>

<p>To better see it type:</p>

<pre><code>lsusb -t
</code></pre>

<p>Output:</p>

<pre><code>...
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 1: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 1: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 84, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 85, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 2: Dev 86, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 3: Dev 87, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 4: Dev 88, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
    |__ Port 3: Dev 89, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
...
</code></pre>

<p>By connecting/disconnecting you can see which devices are on which ports</p>
 4908: <p>You can always make some kind of id print via serial in void setup(). After the certain board is connected it will send this id to your USB interface (which you are listening with some kind of daemon app on your linux box). Once you receive id you can map it to it's path
 'Arduino1' : '/dev/ttyACM0', 
 'Arduino2' : '/dev/ttyACM1',
 'Arduino3' : '/dev/ttyACM2'...etc</p>

<p>Be aware that when device is disconnected for some reason it can change it's physical path so you might have to remap all of them. For this case it might be good to write separate function ex: get_id() which you can call any time (not only on startup).</p>
 6322: <p>I would have used a script to make an alias under <code>/dev/</code> and also set group and rights on it with <code>udev</code> like the other answers.</p>

<p>But if I didn't have <code>udev</code> I would pipe <code>lsusb</code> into <code>grep</code> or <code>awk</code>, like <code>lsusb|grep -e "idProduct"</code>.</p>

<p>Anyway, with <code>udev</code> rules or with <code>lsusb</code> and <code>grep</code> to identify USB devices, use <code>idVendor</code>, <code>idProduct</code> and <code>iSerial</code> in <code>Device descriptor</code> part of <code>lsusb</code> to make the proper idenification.  The <code>idVendor</code> tells you the manufaturer, <code>idProduct</code> should indentify the product from the manufacturer but sometimes they use the same product id for more than one product.  Lastly, if needed, the <code>iSerial</code> should be a unique id for each example of that product.</p>
 19013: <p>This is quite easy! You have to customize the ftdi chips firmware and add an udev rule:</p>

<p>First, get <code>ftdi_eeprom</code> via <code>apt-get</code> or from the sources. Identify your device via lsusb and get the id:</p>

<pre>
lsusb

Bus 001 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
....
</pre>

<p>Prepare a config and make sure, that <code>vendor_id</code> and <code>product_id</code> match. Customize the strings in the <code>Strings</code> section to get a unique id for your device. </p>

<pre>
vendor_id=0x0403    # Vendor ID
product_id=0x6001   # Product ID

max_power=50        # Max. power consumption: value * 2 mA. Use 0 if self_powered = true.

###########
# Strings #
########### 
manufacturer="FTDI"     # Manufacturer
product="Arduino Nano"      # Product
serial="arduino1"       # Serial

###########
# Options #
###########
self_powered=false  # Turn this off for bus powered
remote_wakeup=false # Turn this on for remote wakeup feature
use_serial=true     # Use the serial number string

# Normally out don't have to change one of these flags
# BM_type_chip=true         # Newer chips are all BM type
in_is_isochronous=false     # In Endpoint is Isochronous
out_is_isochronous=false    # Out Endpoint is Isochronous
suspend_pull_downs=false    # Enable suspend pull downs for lower power
change_usb_version=false    # Change USB Version
usb_version=0x0200      # Only used when change_usb_version is enabled

########
# Misc #
########

filename="eeprom.old"   # Filename, leave empty to skip file writing
cbus0=RXLED#
cbus1=TXLED#
</pre>

<p>Dump the current ftdi-firmware:</p>

<p><code>ftdi_eeprom --read-eprom</code></p>

<p>This command creates <code>${pwd}/eeprom.old</code>, which contains the current firmware on the ftdi. <strong>Backup</strong> this file <strong>before continuing</strong>, because during <code>flash-eeprom</code> the file gets rewritten. After the backup, flash the ftdi:</p>

<pre><code>ftdi_eeprom --flash-eeprom myconfig.conf
</code></pre>

<p>Now, create an udev rule, like so</p>

<pre><code>SUBSYSTEMS=="usb", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="$attr{serial}", OWNER="bananapi", GROUP="pi", MODE="0777"
</code></pre>

<p>in <code>/etc/udev/rules.d/90-arduino-usb.rules</code> and restart udev. </p>

<pre><code>service udev restart
</code></pre>

<p>Unplug and re-plug your device and try</p>

<pre><code>ls -lah /dev/arduino1
</code></pre>

<p>Where <code>arduino1</code> is the string defined under <code>serial</code> in the above <code>.conf</code>. </p>

<p>See also: <a href="https://arduino.stackexchange.com/questions/22252/risks-of-ftdi-eeprom-tx-always-high-after-flashing">Risks of ftdi_eeprom? - TX always high after flashing</a></p>
 490: <p>You can add an alias for each. Then you know which is which. Here is a nice <a href="http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/" rel="nofollow noreferrer">tutorial</a> on how to set this up.</p>

<p>Here is a snippet that I wrote based on the tutorial. In the below example, I am using a FTDI RS232RL USB to Serial adapter, which I believe is what the Arduino uses too. </p>

<ol>
<li>In order to assign an alias to a USB-Serial device, we need to find some info on the device</li>
<li>Plug in the usb. This assumes you have already install the drivers for this use be device and the device is visible when typing:</li>
</ol>

<p><code>lsusb</code></p>

<ol start="3">
<li>We are going to need the following
a.    The vendor id
b.    The product id
c.    The device serial number</li>
<li>To do this, it takes a little bit of hunting. All your devices log entries in '/var/log/messages'. </li>
</ol>

<p>Therefore we can read this file and find the correct USB:</p>

<pre><code>grep "ftdi" /var/log/messages
</code></pre>

<p>You can also use "usb"</p>

<ol start="5">
<li><p>This is find all messages tagged with ftdi:</p></li>
<li><p>Next to ftdi_sio, there is a number like 1-1.2. This is the USB device</p></li>
</ol>

<p><code>grep "usb 1-1.2" /var/log/messages</code></p>

<p>Or you can use:</p>

<pre><code>dmesg | grep "usb 1-1.3"
</code></pre>

<ol start="7">
<li>This gives us all the info we need:</li>
</ol>

<p><img src="https://i.stack.imgur.com/D0LTA.png" alt="USB Alias"></p>

<ol start="8">
<li>Now with the list of serial numbers in hand let’s create a UDEV ruleset that’ll make a nice symbolic link for each of these devices. UDEV rules are usually scattered into many files in /etc/udev/rules.d. Create a new file called 99-usb-serial.rules and put the following lines in there:</li>
</ol>

<p>In this example my alias is called 'lcdbox'</p>

<pre><code>SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A601ERJJ", SYMLINK+="lcdbox"
</code></pre>

<ol start="9">
<li>SYMLINK is the name of your alias. In this case my alias is lcdbox.</li>
<li><p>Save the file and type</p>

<p>sudo udevadm control --reload-rules</p></li>
<li><p>Type</p>

<p>ls –l /dev/lcdbox</p></li>
</ol>

<p>lrwxrwxrwx 1 root root 7 Jan  1  1970 /dev/lcdbox -> ttyUSB0</p>

<ol start="12">
<li>This shows that my lcdbox alias is mapped to ttyUSB0</li>
</ol>
 84: <p>On Ubuntu 16.04 (and maybe previous versions or other distribs too), you can do:</p>

<pre><code>&gt; ls /dev/serial/by-id
</code></pre>

<p>which displays (on my box where an Arduino UNO is connected):</p>

<pre><code>usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00
</code></pre>

<p>You can easily spot the Device ID 0043 (UNO) here.</p>

<p>This file is actually a link to <code>/dev/ttyACM0</code> in my box.</p>
 2973: <p>Assuming your distro is using <code>udev</code>:</p>

<pre><code>udevadm info --query=all --name=/dev/ttyACM0
</code></pre>

<p>You might need root privileges to run this(sudo / su). It will output a list of information like this:</p>

<pre><code>P: /devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
N: ttyACM0
S: serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00
S: serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVLINKS=/dev/serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00 /dev/serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVNAME=/dev/ttyACM0
E: DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
E: ID_BUS=usb
E: ID_MM_CANDIDATE=1
E: ID_MODEL=LUFA_USB-RS232_Adapter
E: ID_MODEL_ENC=LUFA\x20USB-RS232\x20Adapter
E: ID_MODEL_FROM_DATABASE=Uno R3 (CDC ACM)
E: ID_MODEL_ID=0043
E: ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
E: ID_PATH_TAG=pci-0000_00_1d_2-usb-0_2_1_0
E: ID_REVISION=0001
E: ID_SERIAL=Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012
E: ID_SERIAL_SHORT=74133353537351403012
E: ID_TYPE=generic
E: ID_USB_DRIVER=cdc_acm
E: ID_USB_INTERFACES=:020201:0a0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Dean_Camera
E: ID_VENDOR_ENC=Dean\x20Camera
E: ID_VENDOR_FROM_DATABASE=Arduino SA
E: ID_VENDOR_ID=2341
E: MAJOR=166
E: MINOR=0
E: SUBSYSTEM=tty
E: UDEV_LOG=3
E: USEC_INITIALIZED=751387324986
</code></pre>

<p>This is for an Uno with modified firmware on the atmega16u2(usb to serial). The lines of interest are probably ID_MODEL_ID and ID_MODEL_FROM_DATABASE.</p>
