Как найти все последовательные устройства (ttyS, ttyUSB..) на Linux, не открывая их?

Что надлежащий путь состоит в том, чтобы получить список всех доступных последовательных портов/устройств в системе Linux?

Другими словами, когда я выполняю итерации по всем устройствам в /dev/, как я говорю, которые последовательные порты классическим способом, то есть, те, которые обычно поддерживают управление потоком РТС/CTS и скорости в бодах?

Решение было бы кодировано в C.

Я спрашиваю, потому что я пользуюсь сторонней библиотекой, которая делает это ясно неправильно: Это, кажется, только выполняет итерации /dev/ttyS*. Проблема состоит в том, что существуют, например, последовательные порты по USB (обеспечены адаптерами USB-RS232), и они перечислены под/dev/ttyUSB*. И читая последовательное практическое руководство по Linux.org, я получаю идею, что будут другие пространства имен также, когда время настает.

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

Я предполагаю, что один путь состоял бы в том, чтобы открыть все файлы от /dev/tty* и назовите определенное ioctl() на них, который только доступен на последовательных устройствах. Это было бы хорошим решением, хотя?

Обновление

hrickards предложил посмотреть на источник для "setserial". Его код делает точно, что я имел в виду:

Во-первых, это открывает устройство с:

fd = open (path, O_RDWR | O_NONBLOCK)

Затем это вызывает:

ioctl (fd, TIOCGSERIAL, &serinfo)

Если тот вызов не возвращает ошибки, то это - последовательное устройство, по-видимому.

Я нашел подобный код в Последовательном программировании/termios, который предложил также добавить O_NOCTTY опция.

Существует одна проблема с этим подходом, хотя:

Когда я протестировал этот код Unix BSD (то есть,  Mac OS X), он работал также. Однако последовательные устройства, которые обеспечиваются через Bluetooth, заставляют систему (драйвер) пытаться соединиться с bluetooth-устройством, которое требует времени, прежде чем это возвратится с ошибкой из-за тайм-аута. Это вызывается, просто открыв устройство. И я могу предположить, что подобные вещи могут произойти на Linux также - идеально, я не должен должен быть открывать устройство для выяснения его типа. Интересно, существует ли также способ вызвать ioctl функции без открытого, или открытый устройство способом, что это не заставляет соединения быть сделанными?

Что мне делать?

104
задан Thomas Tempelmann 25 June 2016 в 13:20
поделиться

2 ответа

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

import dbus
bus = dbus.SystemBus()
hwmanager = bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')
hwmanager_i = dbus.Interface(hwmanager, 'org.freedesktop.Hal.Manager')
print hwmanager_i.FindDeviceByCapability("serial")

Если это не удается, вы можете поискать внутри hwmanager_i.GetAllDevicesWithProperties () , чтобы увидеть, не имеет ли имя возможности "serial", которое я только что предположил, другое имя.

HTH

2
ответ дан 24 November 2019 в 04:12
поделиться

setserial с параметром -g, похоже, делает то, что вы хотите, а исходный код C доступен по адресу http://www.koders.com/c/fid39344DABD14604E70DF1B8FEA7D920A94AF78BF8.aspx .

3
ответ дан 24 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: