Linux device enumeration
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
add a comment |
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
add a comment |
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
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
linux usb-device
asked 1 hour ago
folibisfolibis
15217
15217
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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
brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!
– folibis
44 mins ago
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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
brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!
– folibis
44 mins ago
add a comment |
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
brilliant! that exactly what I was looking for. for some reason, I missed udev. Thanks!
– folibis
44 mins ago
add a comment |
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
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
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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