2013-03-11 13 views
5

Czy istnieje dobry sposób na wykrycie wszystkich podłączonych urządzeń podłączonych do portów szeregowych w systemie Linux? Im programowanie w C++, ale inne przykłady również są mile widziane.Cux Linux wykrywa wszystkie porty szeregowe

Możesz po prostu spróbować otworzyć każdy port i kiedy mu się powiedzie, dodasz go do listy portów, ale nie wydaje się to dobrym rozwiązaniem.

Możesz wejść do dev dyrektorów, a ponieważ mój port szeregowy to port USB, mogę sprawdzić, które pliki ttyUSB .. zostały utworzone. Ale to nie działa dla portów szeregowych innych niż USB, ponieważ pliki dla tty0 do tty63 są zawsze w tym katalogu.

Mój przykład:

std::string port; 
int fd 
std::vector<std::string>> list; 
for(int i = 0; i < 256; ++i) 
{ 
    port.clear(); 
    port.append("/dev/ttyUSB"); 
    port.append(std::to_string(i)); 
    fd = open(port.c_str(), O_RDWR | O_NOCTTY | O_DELAY); 
    if(fd != -1) 
    { 
     list.push_back(port); 
    } 
} 

Dzięki!

+0

Porty szeregowe są zwykle nazywane "ttyS0" i tak dalej. – Hasturkun

+1

To daje mi wrażenie pytania XY, gdzie twoim rzeczywistym problemem jest X, i myślisz, że rozwiązaniem jest Y, więc pytasz o Y. Dlaczego chcesz wiedzieć o portach szeregowych w systemie? –

+0

Na jednym z portów jest połączone urządzenie zigbee. Ponieważ chcę, aby był przyjazny dla użytkownika, chcę wyświetlić wszystkie możliwości, które użytkownik może wybrać. Zwykle po podłączeniu urządzenia zigbee powinieneś otrzymać dokładnie jeden numer portu, który został ci zwrócony. @Hasturkun W moim przypadku, ponieważ moje urządzenie szeregowe korzysta z połączenia USB, nazywa się ttyUSB0. – Silver

Odpowiedz

7

Standardowym sposobem wyliczania urządzeń w systemie Linux jest przeglądanie systemu plików /sys. W tym przypadku, można do następującego:

  1. wyliczyć wszystkie pliki w /sys/class/tty
  2. dla każdego katalogu /sys/class/tty/foo, sprawdź czy /sys/class/tty/foo/device istnieje używając lstat().
    • Jeśli nie istnieje, to masz do czynienia z wirtualnym urządzeniem tty (port konsoli wirtualnej, ptmx itp.) I możesz go odrzucić.
    • Jeśli istnieje, zachowaj port szeregowy foo.

powinien być pozostawiony z listą aktualnych portów szeregowych.

+0

Otrzymuję 32 urządzenia za pośrednictwem tego mechanizmu. 2 są ważne. Musisz sprawdzić, czy nie wskazuje na 'serial8250', który jest właściwie tylko sterownikiem. – Petesh

+0

Na niektórych moich systemach mam prawdziwe poprawne porty szeregowe, gdzie symboliczne dowiązanie' device' wskazuje na 'serial8250' ... Nie jestem jasne, dlaczego dostajesz tak wiele nieważnych. – Celada

+0

32 pochodzi z konfiguracji jądra "CONFIG_SERIAL_8250_RUNTIME_UARTS", zakładam, że obsługuje on więcej niż domyślne '32' (jest to jądro 3.2 jądra x64). – Petesh