Есть ли способ получить доступ к USB-последовательному порту по идентификатору устройства, а не через порт tty. *?

17

На Linux USB-серийных устройства создают два псевдонима для последовательного порта:
/dev/tty*и/dev/serial/by-id/<my_usb_device_id>

Есть ли способ на OSX идентифицировать последовательный порт по идентификатору устройства USB? И в System Profiler, и при использовании ioreg -p IOUSBя могу видеть идентификатор, но это не приближает меня к подключению с использованием этого идентификатора.

Мы разрабатываем несколько единиц оборудования, и тестировать их очень сложно, так как каждый раз, когда я подключаю другое устройство, мне нужно проверять конфигурацию последовательного порта тестируемого программного обеспечения, потому что в OSX tty.*имя порта зависит от порта на моем компьютере, не на устройстве. Ребята, работающие под Linux, с радостью используют /dev/serial/by-id/<my_usb_device_id>порт, чтобы автоматически различать разные устройства.

Johan
источник

Ответы:

2

Для имеющегося у меня моста FTDI серийный номер уже появляется в имени устройства: он отображается как /dev/serial/by-id/usb-FTDI_FT231X_USB_UART_DA00AG57-if00-port0(соответствующий некоторым /dev/ttyUSBx) в Linux, а также как /dev/cu.usbserial-DA00AG57и /dev/tty.usbserial-DA00AG57в macOS. (См. Https://stackoverflow.com/a/8632603/4896937 для различия между tty.*и cu.*.)

К сожалению, для моста Prolific, который у меня есть, проблема, подобная вашей, по-прежнему актуальна: устройство, отображаемое как /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0(которое не содержит серийный номер), просто /dev/cu.usbserialи /dev/tty.usbserialв macOS (даже System Profiler не дает для него серийный номер). Кто знает, что произойдет, если я подключу второй.

Возможно, есть более общий ответ, который не зависит от производителя, но имейте в виду, что некоторые устройства могут не сообщать серийный номер.

chrstphrchvz
источник
Для меня они отображаются как /dev/tty.usbmodemFD121 и /dev/tty.usbmodemFA131. Количество напрямую зависит от порта USB на моем ноутбуке. Информация о системе показывает правильный идентификатор для устройств, установленных их прошивкой. Оба сериала созданы процессорами STM32F2 / F4.
Йохан
2

На самом деле вы должны быть в состоянии найти соответствие между идентификатором устройства / серийным номером и именем последовательного порта, используя ioreg. Попробуйте эту команду:

ioreg -r -c IOUSBHostDevice -l

Он распечатает все хост-устройства USB и распечатает все свойства из поддерева каждого устройства. Вы должны быть в состоянии найти ваше устройство на верхнем уровне по его идентификатору или серийному номеру. Найдя его, вы сможете сканировать его поддерево и в конечном итоге найти объект класса IOSerialBSDClient. Это будет содержать свойство, IODialinDeviceкоторое вы хотите.

Если вы затем хотите сделать это программно, вы можете добавить -aопцию в ioregкоманду, которая выведет версию plist вышеприведенного вывода. Затем вы можете разобрать это с помощью библиотеки, например plistlib.

Возможно, вам будет полезно использовать приложение IORegistryExplorer, чтобы помочь визуализировать это, поскольку полный ioregвывод немного сложно прочитать! Это доступно в пакете XCode «Hardware IO Tools», который можно найти, выполнив поиск по загрузкам на сайте разработчиков Apple . Вот как это выглядит на моем устройстве:

Пример IORegistryExplorer

Дональд Харви
источник