Linux device enumeration












3















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



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 | O_NOCTTY | O_NDELAY);
}


The link to the device we use.










share|improve this question



























    3















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



    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 | O_NOCTTY | O_NDELAY);
    }


    The link to the device we use.










    share|improve this question

























      3












      3








      3


      1






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



      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 | O_NOCTTY | O_NDELAY);
      }


      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 a application and until yesterday, everything worked fine. But suddenly (yeah, during the remote presentation ...) the device has stopped to work. After a quick research I've found the the connection has changed to /dev/ttyACM1. it was a little untimely, but now I have a problem - how to identify my device in some unambiguously way? Like, for example the storage drive could be initialized using UUID although the /dev/sd** has changed. Is the there some way to do that for serial device?



      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 | O_NOCTTY | O_NDELAY);
      }


      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










      asked 1 hour ago









      folibisfolibis

      15217




      15217






















          1 Answer
          1






          active

          oldest

          votes


















          4














          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
          ATTRS{serial}=="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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/arduino -> 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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="arduino"


          Taken from here






          share|improve this answer
























          • brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!

            – folibis
            44 mins ago











          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%2flinux-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









          4














          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
          ATTRS{serial}=="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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/arduino -> 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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="arduino"


          Taken from here






          share|improve this answer
























          • brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!

            – folibis
            44 mins ago
















          4














          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
          ATTRS{serial}=="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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/arduino -> 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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="arduino"


          Taken from here






          share|improve this answer
























          • brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!

            – folibis
            44 mins ago














          4












          4








          4







          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
          ATTRS{serial}=="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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/arduino -> 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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="arduino"


          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
          ATTRS{serial}=="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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
          SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

          ls -l /dev/MySerialDevice
          lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/arduino -> 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", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="arduino"


          Taken from here







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 49 mins ago









          thecarpythecarpy

          2,485926




          2,485926













          • brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!

            – folibis
            44 mins ago



















          • brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!

            – folibis
            44 mins ago

















          brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!

          – folibis
          44 mins ago





          brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!

          – folibis
          44 mins ago


















          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%2flinux-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







          Popular posts from this blog

          Михайлов, Христо

          Гороховецкий артиллерийский полигон

          Центральная группа войск