Consistent Linux device enumeration2019 Community Moderator ElectionIs pvcreate destructive? Attempting to recover an lvm2 volume groupHow to check if unmount of USB device is completed?Safely remove usb from linux deviceHow to make a USB device report as “device busy”?Consistent enumeration of a btattached controllerHow to safely insert USB stick/device to Linux computer?why doesn't lsusb list a deviceSpecify Function on USB DeviceLinux - Why are my core IDs not consistent?AT commands communication establishment in Linux USB device driver

Find fails if filename contains brackets

Organic chemistry Iodoform Reaction

Does the Large evolution retroactively increase the cost of Ability Increase evolutions?

How do I repair my stair bannister?

Calculating the number of days between 2 dates in Excel

What is this type of notehead called?

What linear sensor for a keyboard?

Getting the lowest value with key in array

Should my PhD thesis be submitted under my legal name?

Have I saved too much for retirement so far?

Suggestion on Missing Index Creation

How to prevent YouTube from showing already watched videos?

Freedom of speech and where it applies

What would you call a finite collection of unordered objects that are not necessarily distinct?

Why did the EU agree to delay the Brexit deadline?

How will losing mobility of one hand affect my career as a programmer?

What should I use for Mishna study?

Why does the compiler allow throws when the method will never throw the Exception

Can an armblade require double attunement if it integrates a magic weapon that normally requires attunement?

Female=gender counterpart?

What is the term when two people sing in harmony, but they aren't singing the same notes?

JavaScript array of objects contains the same array data

Are MQTT Brokers able to retain/cache some data for a certain amount of time and then send to the subscribers?

Make "apt-get update" show the exact output as `apt update`



Consistent Linux device enumeration



2019 Community Moderator ElectionIs pvcreate destructive? Attempting to recover an lvm2 volume groupHow to check if unmount of USB device is completed?Safely remove usb from linux deviceHow to make a USB device report as “device busy”?Consistent enumeration of a btattached controllerHow to safely insert USB stick/device to Linux computer?why doesn't lsusb list a deviceSpecify Function on USB DeviceLinux - Why are my core IDs not consistent?AT commands communication establishment in Linux USB device driver










13















In our Linux box we have USB -> serial device which was always identified as
/dev/ttyACM0. So I've written an application and until yesterday, everything worked fine. But suddenly (yeah, during the remote presentation ...) the device stopped working. After quick research, I found that the connection changed to /dev/ttyACM1. It was a little untimely, but now I have a problem - how to unambiguously identify my device? Like, for example, the storage drive could be initialized using UUID although the /dev/sd** has changed. Is there some way to do that for serial devices?



Now I use a stupid workaround:



for(int i = 0; i < 10; i ++)

m_port = std::string("/dev/ttyACM") + (char)('0' + i);
m_fd = open(m_port.c_str(), O_RDWR


The link to the device we use.










share|improve this question




























    13















    In our Linux box we have USB -> serial device which was always identified as
    /dev/ttyACM0. So I've written an application and until yesterday, everything worked fine. But suddenly (yeah, during the remote presentation ...) the device stopped working. After quick research, I found that the connection changed to /dev/ttyACM1. It was a little untimely, but now I have a problem - how to unambiguously identify my device? Like, for example, the storage drive could be initialized using UUID although the /dev/sd** has changed. Is there some way to do that for serial devices?



    Now I use a stupid workaround:



    for(int i = 0; i < 10; i ++)

    m_port = std::string("/dev/ttyACM") + (char)('0' + i);
    m_fd = open(m_port.c_str(), O_RDWR


    The link to the device we use.










    share|improve this question


























      13












      13








      13


      3






      In our Linux box we have USB -> serial device which was always identified as
      /dev/ttyACM0. So I've written an application and until yesterday, everything worked fine. But suddenly (yeah, during the remote presentation ...) the device stopped working. After quick research, I found that the connection changed to /dev/ttyACM1. It was a little untimely, but now I have a problem - how to unambiguously identify my device? Like, for example, the storage drive could be initialized using UUID although the /dev/sd** has changed. Is there some way to do that for serial devices?



      Now I use a stupid workaround:



      for(int i = 0; i < 10; i ++)

      m_port = std::string("/dev/ttyACM") + (char)('0' + i);
      m_fd = open(m_port.c_str(), O_RDWR


      The link to the device we use.










      share|improve this question
















      In our Linux box we have USB -> serial device which was always identified as
      /dev/ttyACM0. So I've written an application and until yesterday, everything worked fine. But suddenly (yeah, during the remote presentation ...) the device stopped working. After quick research, I found that the connection changed to /dev/ttyACM1. It was a little untimely, but now I have a problem - how to unambiguously identify my device? Like, for example, the storage drive could be initialized using UUID although the /dev/sd** has changed. Is there some way to do that for serial devices?



      Now I use a stupid workaround:



      for(int i = 0; i < 10; i ++)

      m_port = std::string("/dev/ttyACM") + (char)('0' + i);
      m_fd = open(m_port.c_str(), O_RDWR


      The link to the device we use.







      linux usb-device






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Mar 20 at 11:03









      Anthony Geoghegan

      7,93654055




      7,93654055










      asked Mar 20 at 7:10









      folibisfolibis

      20229




      20229




















          1 Answer
          1






          active

          oldest

          votes


















          18














          Since we are talking USB devices and assuming you have udev, you could setup some udev rules.



          I guess, and this is just a wild guess, somebody or something unplugged/removed the device and plugged it back in/added the device again, which bumps up the number.



          Now, first you need vendor and product id's:



          $ lsusb
          Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
          Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC


          Next, you need the serial number (in case you have several):



          # udevadm info -a -n /dev/ttyUSB1 | grep 'serial' | head -n1
          ATTRSserial=="A6008isP"


          Now, lets create a udev rule:



          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 line in there, I have three devices, each with a a different serial number:



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1


          If you do not want the serial number, any device from vendor with same chip will then get the same symlink, only one can be plugged in at any given time.



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", SYMLINK+="MySerialDevice"


          Taken from here






          share|improve this answer




















          • 3





            If you have a recent linux distribution, most likely it already automatically creates the device as /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. This might be enough for you without custom udev rules.

            – Josef
            Mar 20 at 10:07






          • 1





            Unfortunately, many no-name devices all have the serial number "0123456789abcdef". That's where it gets interesting.

            – mosvy
            Mar 20 at 11:03











          • @mosvy are serial numbers unchangable?

            – OganM
            Mar 20 at 20:05











          • @OganM they may be changed ... if you're able to root the devices.

            – mosvy
            Mar 20 at 20:24










          Your Answer








          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "106"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f507349%2fconsistent-linux-device-enumeration%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          18














          Since we are talking USB devices and assuming you have udev, you could setup some udev rules.



          I guess, and this is just a wild guess, somebody or something unplugged/removed the device and plugged it back in/added the device again, which bumps up the number.



          Now, first you need vendor and product id's:



          $ lsusb
          Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
          Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC


          Next, you need the serial number (in case you have several):



          # udevadm info -a -n /dev/ttyUSB1 | grep 'serial' | head -n1
          ATTRSserial=="A6008isP"


          Now, lets create a udev rule:



          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 line in there, I have three devices, each with a a different serial number:



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1


          If you do not want the serial number, any device from vendor with same chip will then get the same symlink, only one can be plugged in at any given time.



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", SYMLINK+="MySerialDevice"


          Taken from here






          share|improve this answer




















          • 3





            If you have a recent linux distribution, most likely it already automatically creates the device as /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. This might be enough for you without custom udev rules.

            – Josef
            Mar 20 at 10:07






          • 1





            Unfortunately, many no-name devices all have the serial number "0123456789abcdef". That's where it gets interesting.

            – mosvy
            Mar 20 at 11:03











          • @mosvy are serial numbers unchangable?

            – OganM
            Mar 20 at 20:05











          • @OganM they may be changed ... if you're able to root the devices.

            – mosvy
            Mar 20 at 20:24















          18














          Since we are talking USB devices and assuming you have udev, you could setup some udev rules.



          I guess, and this is just a wild guess, somebody or something unplugged/removed the device and plugged it back in/added the device again, which bumps up the number.



          Now, first you need vendor and product id's:



          $ lsusb
          Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
          Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC


          Next, you need the serial number (in case you have several):



          # udevadm info -a -n /dev/ttyUSB1 | grep 'serial' | head -n1
          ATTRSserial=="A6008isP"


          Now, lets create a udev rule:



          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 line in there, I have three devices, each with a a different serial number:



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1


          If you do not want the serial number, any device from vendor with same chip will then get the same symlink, only one can be plugged in at any given time.



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", SYMLINK+="MySerialDevice"


          Taken from here






          share|improve this answer




















          • 3





            If you have a recent linux distribution, most likely it already automatically creates the device as /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. This might be enough for you without custom udev rules.

            – Josef
            Mar 20 at 10:07






          • 1





            Unfortunately, many no-name devices all have the serial number "0123456789abcdef". That's where it gets interesting.

            – mosvy
            Mar 20 at 11:03











          • @mosvy are serial numbers unchangable?

            – OganM
            Mar 20 at 20:05











          • @OganM they may be changed ... if you're able to root the devices.

            – mosvy
            Mar 20 at 20:24













          18












          18








          18







          Since we are talking USB devices and assuming you have udev, you could setup some udev rules.



          I guess, and this is just a wild guess, somebody or something unplugged/removed the device and plugged it back in/added the device again, which bumps up the number.



          Now, first you need vendor and product id's:



          $ lsusb
          Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
          Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC


          Next, you need the serial number (in case you have several):



          # udevadm info -a -n /dev/ttyUSB1 | grep 'serial' | head -n1
          ATTRSserial=="A6008isP"


          Now, lets create a udev rule:



          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 line in there, I have three devices, each with a a different serial number:



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1


          If you do not want the serial number, any device from vendor with same chip will then get the same symlink, only one can be plugged in at any given time.



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", SYMLINK+="MySerialDevice"


          Taken from here






          share|improve this answer















          Since we are talking USB devices and assuming you have udev, you could setup some udev rules.



          I guess, and this is just a wild guess, somebody or something unplugged/removed the device and plugged it back in/added the device again, which bumps up the number.



          Now, first you need vendor and product id's:



          $ lsusb
          Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
          Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC


          Next, you need the serial number (in case you have several):



          # udevadm info -a -n /dev/ttyUSB1 | grep 'serial' | head -n1
          ATTRSserial=="A6008isP"


          Now, lets create a udev rule:



          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 line in there, I have three devices, each with a a different serial number:



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", ATTRSserial=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1


          If you do not want the serial number, any device from vendor with same chip will then get the same symlink, only one can be plugged in at any given time.



          SUBSYSTEM=="tty", ATTRSidVendor=="0403", ATTRSidProduct=="6001", SYMLINK+="MySerialDevice"


          Taken from here







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Mar 20 at 8:49

























          answered Mar 20 at 7:58









          thecarpythecarpy

          2,6501028




          2,6501028







          • 3





            If you have a recent linux distribution, most likely it already automatically creates the device as /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. This might be enough for you without custom udev rules.

            – Josef
            Mar 20 at 10:07






          • 1





            Unfortunately, many no-name devices all have the serial number "0123456789abcdef". That's where it gets interesting.

            – mosvy
            Mar 20 at 11:03











          • @mosvy are serial numbers unchangable?

            – OganM
            Mar 20 at 20:05











          • @OganM they may be changed ... if you're able to root the devices.

            – mosvy
            Mar 20 at 20:24












          • 3





            If you have a recent linux distribution, most likely it already automatically creates the device as /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. This might be enough for you without custom udev rules.

            – Josef
            Mar 20 at 10:07






          • 1





            Unfortunately, many no-name devices all have the serial number "0123456789abcdef". That's where it gets interesting.

            – mosvy
            Mar 20 at 11:03











          • @mosvy are serial numbers unchangable?

            – OganM
            Mar 20 at 20:05











          • @OganM they may be changed ... if you're able to root the devices.

            – mosvy
            Mar 20 at 20:24







          3




          3





          If you have a recent linux distribution, most likely it already automatically creates the device as /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. This might be enough for you without custom udev rules.

          – Josef
          Mar 20 at 10:07





          If you have a recent linux distribution, most likely it already automatically creates the device as /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. This might be enough for you without custom udev rules.

          – Josef
          Mar 20 at 10:07




          1




          1





          Unfortunately, many no-name devices all have the serial number "0123456789abcdef". That's where it gets interesting.

          – mosvy
          Mar 20 at 11:03





          Unfortunately, many no-name devices all have the serial number "0123456789abcdef". That's where it gets interesting.

          – mosvy
          Mar 20 at 11:03













          @mosvy are serial numbers unchangable?

          – OganM
          Mar 20 at 20:05





          @mosvy are serial numbers unchangable?

          – OganM
          Mar 20 at 20:05













          @OganM they may be changed ... if you're able to root the devices.

          – mosvy
          Mar 20 at 20:24





          @OganM they may be changed ... if you're able to root the devices.

          – mosvy
          Mar 20 at 20:24

















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Unix & Linux Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f507349%2fconsistent-linux-device-enumeration%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown