У меня есть Arduino, который иногда связан, /dev/ttyUSB0
а иногда и /dev/ttyUSB1
делает мой сценарий неудачным.
Я не хочу перечислять все возможности того, где может находиться мое устройство, но я бы предпочел, чтобы оно было связано где-то статично, например /dev/arduino
.
Как мне этого добиться?
linux
arch-linux
usb
serial-port
arduino
k0pernikus
источник
источник
Ответы:
Как и предполагалось, вы можете добавить некоторые правила udev. Я отредактировал,
/etc/udev/rules.d/10-local.rules
чтобы содержать:Вы можете проверить переменные вашего устройства, запустив
Существует более подробное руководство, которое вы можете прочитать на http://www.reactivation.net/writing_udev_rules.html.
источник
udevam
? И важно отметить, чтоmy_uart
создает символическую ссылку под/dev/my_uart
. Я впервые написал/dev/arduino
в первый раз, и это не удалось, покаarduino
достаточно.udevadm
должен выйти сам, когда это будет сделано.Синтаксис правила выше может работать на некоторых дистрибутивах, но не работает на моем (Raspbian). Поскольку я не нашел ни одного документа, объясняющего все входы и выходы, я написал свой собственный, который можно найти здесь . Вот к чему это сводится.
1. узнать что есть на ttyUSB:
2. перечислите все атрибуты устройства:
(с номером вашего устройства вместо х, конечно). Выберите уникальный набор идентификаторов, например, idVendor + idProduct. Вам также может понадобиться SerialNumber, если у вас есть несколько устройств с одинаковыми idVendor и idProduct. Серийные номера должны быть уникальными для каждого устройства.
3. Создайте файл
/etc/udev/rules.d/99-usb-serial.rules
с такой строкой:(при условии, что вам не нужен серийный номер там, и, конечно, с номерами для idVendor и idProduct, которые вы нашли в шаге 2.
4. Загрузите новое правило:
5. Проверьте, что случилось:
покажет, на какой номер ttyUSB пошла символическая ссылка. Если это так
/dev/ttyUSB1
, то проверьте, кому это принадлежит и к какой группе оно принадлежит:Тогда просто для удовольствия:
источник
idVendor
иidProduct
точно так же? (два датчика подключены к идентичным моделям USB для модулей UART)udevadm info --name=/dev/ttyUSB1 --attribute-walk
для обоих устройств и найдите серийные номера, они должны быть уникальными для каждого устройства. Если у ваших датчиков нет серийного номера, можете ли вы указать, какие они есть?Проблема с несколькими идентичными USB-устройствами
У меня есть Rasperry Pi с четырьмя камерами. Я принимаю пикс с
fswebcam
которой идентифицирует камеры , как/dev/video0
..video3
. Иногда камераvideo0
,vide02
,video4
и ,video6
но мы можем забыть о том, что на данный момент.Мне нужен постоянный идентификатор для идентификации номера камеры, чтобы, например
video0
, всегда была одна и та же камера, потому что я подписываю снимки. К сожалению, это не происходит надежно - при загрузке камеры перечисляются какvideo0
...video3
но не всегда одинаково.Все камеры имеют одинаковый идентификатор и серийный номер.
Решение этой проблемы включает в себя правила udev, но там также есть много рыболовных крючков.
Если вы выполните команду
вы получаете разметку выходных данных, но выдающиеся биты
Бит KERNELS - это порт USB-концентратора. С четырьмя камерами их четыре - они не меняются при перезагрузке, но
video{x}
связанные с портом могут измениться.Поэтому нам нужно правило udev для привязки номера видео к порту USB-концентратора - что-то вроде:
Выглядит просто - доступ к камере с
За исключением того, что это не работает - если вы поместите это в правило udev, и система выделит video0 (при загрузке) для другого порта, правило udev игнорируется. Символьная ссылка в
/dev/camera0
основном говоритno such device
. Квадратная.Мы хотим связать символическую ссылку с адресом USB-концентратора, а не с
video{x}
номером. Потребовалась программа на Python.Первый шаг должен был бежать
для
x
между 1 и 8. Существованиеtst.jpg
после каждого вызова идентифицирует есть ли камера на этом видео числом. Из этого сделайте список активных видео номеров. Мой опыт показывает, что это либо0,1,2,3
или0,2,4,6
для камер я использовал.Другие могут, конечно, построить этот список, используя другой процесс.
Затем для каждого номера видео в списке запустить
и извлечь
KERNELS= line
изdd
. В результате вы получите список адресов портов USB для камер. Сортируйте этот список так, чтобы на следующем шаге вы всегда обрабатывали его в одном и том же порядке. Назовите это «список адресов».Запустите
udevadm … > dd
вещь снова и создайте список, который выглядит какТеперь пройдитесь по списку адресов - для каждой записи найдите соответствующую запись из списка видео. Создайте новый список, который выглядит как набор строк, таких как
Символ x (номер символической ссылки) заменяется порядковым номером в списке адресов.
Теперь у вас есть правило udev, которое работает. Символическая ссылка, привязанная к адресу концентратора USB, независимо от того, какой номер видео выделен этому порту при загрузке.
Запишите окончательный список в файл
/etc/udev/rules.d/cam.rules
. Запустите,udevadm trigger
чтобы активировать его, и работа сделана./dev/camera2
будет одна и та же камера (порт USB) независимо от ее номера видео.источник
Я также смог найти уникальное устройство в
/dev/serial/by-id
. Я еще не пробовал перезагрузить компьютер, но файлы в этом каталоге были просто ссылками на соответствующий файл устройства (ttyACM[0-9]
) .`Я запускаю arch linux на Raspberry Pi, но наткнулся на них, просто сделав
find
для имен файлов, содержащих «Arduino». Мои программы на python работают нормально, используя эти файлы в качестве устройств для чтения / записи данных в / из моих Arduinos (пока что два на одном Pi).источник
Просто чтобы сказать, что вышесказанное сработало для меня, а также автоматически подключило устройство после того, как я поместил запись в / etc / fstab (и он также вызывает umount после удаления флешки)
т.е.
/ И т.д. / Fstab
cat /etc/udev/rules.d/5-usb-stick.rules
Итак, вставив мою флешку, я получаю:
источник