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_NOCTTYopcji.
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 ioctlfunkcji bez otwierania, czy też otwierania urządzenia w taki sposób, że nie powoduje to nawiązywania połączeń?
Co powinienem zrobić?