Jaki jest właściwy sposób uzyskania listy wszystkich dostępnych portów szeregowych / urządzeń w systemie Linux?
Innymi słowy, kiedy iteruję po wszystkich urządzeniach, w /dev/
jaki sposób mogę stwierdzić, które z nich są portami szeregowymi w klasyczny sposób, to znaczy te, które zwykle obsługują prędkości transmisji i kontrolę przepływu RTS / CTS ?
Rozwiązanie byłoby zakodowane w C.
Pytam, ponieważ używam biblioteki innej firmy, która robi to wyraźnie źle: wydaje się, że tylko iteruje /dev/ttyS*
. Problem polega na tym, że istnieją na przykład porty szeregowe przez USB (dostarczane przez adaptery USB-RS232), a te są wymienione w / dev / ttyUSB *. Czytając Serial-HOWTO na Linux.org , doszedłem do wniosku, że z czasem pojawią się również inne przestrzenie nazw.
Muszę więc znaleźć oficjalny sposób wykrywania urządzeń szeregowych. Problem w tym, że żadna z nich nie jest udokumentowana lub nie mogę jej znaleźć.
Wyobrażam sobie, że jednym ze sposobów byłoby otwarcie wszystkich plików z /dev/tty*
i wywołanie określonego ioctl()
z nich, który jest dostępny tylko na urządzeniach szeregowych. Czy byłoby to jednak dobre rozwiązanie?
Aktualizacja
hrickards zasugerował przyjrzenie się źródłu "setserial". Jego kod robi dokładnie to, co miałem na myśli:
Najpierw otwiera urządzenie z:
fd = open (path, O_RDWR | O_NONBLOCK)
Następnie wywołuje:
ioctl (fd, TIOCGSERIAL, &serinfo)
Jeśli to wywołanie nie zwróci żadnego błędu, to najwyraźniej jest to urządzenie szeregowe.
Znalazłem podobny kod w Serial Programming / termios , co sugerowało dodanie tej O_NOCTTY
opcji.
Jest jednak jeden problem z tym podejściem:
Kiedy testowałem ten kod na BSD Unix (czyli Mac OS X), również zadziałał. Jednak urządzenia szeregowe dostarczane przez Bluetooth powodują, że system (sterownik) próbuje połączyć się z urządzeniem Bluetooth, co zajmuje trochę czasu, zanim zwróci błąd przekroczenia limitu czasu. Jest to spowodowane po prostu otwarciem urządzenia. Mogę sobie wyobrazić, że podobne rzeczy mogą się zdarzyć również w Linuksie - w idealnym przypadku nie powinienem otwierać urządzenia, aby określić jego typ. Zastanawiam się, czy istnieje również sposób wywoływania ioctl
funkcji bez otwierania, czy też otwierania urządzenia w taki sposób, że nie powoduje to nawiązywania połączeń?
Co powinienem zrobić?