Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>То есть, у Вас таки получилось надежно адресовать устройство по расположению разъема?
Да, именно по расположению разъёма, но не на USB хабе, а на материнской плате.
ЕМ>А сколько в системе встроенных USB-хабов?
Давай определимся с терминологией.
ЕМ>У меня под рукой только ноутбуки, в каждом по одному хабу, поэтому у себя я тоже не вижу изменений при перезагрузке. А у юзера десктоп, хабов несколько, и они, судя по всему, при перечислении определяются в случайном порядке.
У меня путь ttyUSB#, то есть ttyUSB0, ttyUSB1, ttyUSB2, ttyUSB3 и так далее всё время скакал от устройства к устройству. Это как в Windows был бы COM1, а после перезагрузки стал COM2, а после перевтыкания разъёма опять COM1 или COM3 и так далее. Да, все аналогии с Windows очень условны.
Потому я вместо ttyUSB#, то есть ttyUSB0, ttyUSB1, ttyUSB2, ttyUSB3 создал псевдонимы прибитые к разъёмам USB на материнке и использую для обращения именно псевдонимы ttyUSB_1_2, ttyUSB_1_4, ttyUSB_1_3, ttyUSB_1_5. Причём я мог бы назвать псевдонимы как угодно. И даже мог бы сделать проверку пути вместе с проверкой идентификатора вендора и продукта, просто мне это не нужно.
/etc/udev/rules.d/10-local.rules
SUBSYSTEM=="tty", ATTRS{devpath}=="1.2", SYMLINK+="ttyUSB_1_2", OWNER="velkin", GROUP="dialout", MODE="0666"
SUBSYSTEM=="tty", ATTRS{devpath}=="1.4", SYMLINK+="ttyUSB_1_4", OWNER="velkin", GROUP="dialout", MODE="0666"
SUBSYSTEM=="tty", ATTRS{devpath}=="1.3", SYMLINK+="ttyUSB_1_3", OWNER="velkin", GROUP="dialout", MODE="0666"
SUBSYSTEM=="tty", ATTRS{devpath}=="1.5", SYMLINK+="ttyUSB_1_5", OWNER="velkin", GROUP="dialout", MODE="0666"
Фактически я исключил ту часть пути, которая идёт после выделенного
looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0/tty/ttyUSB0'
Там может быть случайно назначаемый ttyUSB0, ttyUSB1, ttyUSB2, ttyUSB3, ttyUSB4, ttyUSB5, ttyUSB6 и так далее, но мне нужен псевдоним только на.
looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2
У меня была идея использовать ещё и USB Hub, но в принципе хватило и разъёмов на материнской плате. Метод которым я действовал тоже изложил. Создаёшь листинги по известным параметрам, потом сравниваешь kdiff3, которая так же есть в Windows.
Смысл в том, что ttyUSB# воткнутого устройства всё время меняется, но путь разъёма на материнской плате не меняется, это ATTRS{devpath}. А вот с путём USB Hub надо ещё провести опыты.
В мире программирования очень много абстракций. Это надо конкретно сесть за твой код и твои устройства. И даже не только твои, нужно ещё симулировать ситуацию как у твоего пользователя. А дальше по науке логике, анализ (разбор), синтез (сбор) и сравнение.
И повторюсь, всё это чисто для размышления. Потому что сразу готового программного решения как на stackoverflow у меня конкретно для Windows и его библиотек нет. А людей, которые уже решили эту задачу в комментариях можно ждать очень долго.
Ещё есть такое обстоятельство, что если программист решает, что что-то сделать невозможно, он это и не делает. Иногда нужна мотивация, что хотя бы чисто теоретически такое возможно. Я, конечно, за это не поручусь, но тем не менее.