2015-12-09 26 views
16

Używam termios api w systemie Linux do komunikacji z urządzeniem szeregowym. Próbuję wykryć, czy urządzenie zostało rozłączone, więc mogę próbować nawiązać połączenie po pewnym czasie oczekiwania. Mam następujący przykładowy kod:Wykrywanie, czy urządzenie znakowe zostało odłączone w systemie Linux z termios api (C++)

while(1) 
{ 
    FD_ZERO(&rfds); 
    FD_SET(tty_fd, &rfds); 

    // have tried checking fcntl(tty_fd, F_GETFL); too 

    // Blocking call to wait until we have data 
    select(tty_fd+1, &rfds, NULL, NULL, NULL); 

    // While we have data, collect it 
    while (read(tty_fd, &c, 1)>0 && bytesRead++<200) 
    { 
     serialBuffer.push_back(c); 
    } 

    bytesRead = 0; 

    // Try to parse it 
    BufferParse(); 
} 

nie jestem faktycznie widząc select() lub wartości błędów powrót fcntl (-1) za urządzeniem ttyUSB jest fizycznie odłączony. Mógłbym oczywiście sprawdzić, czy plik w/dev/istnieje, ale miałem nadzieję, że istnieje bardziej eleganckie rozwiązanie.

Doceniam każdą poradę, dziękuję!

+3

Za pomocą adaptera USB mogą występować dwa poziomy rozłączenia. Gdy urządzenie jest podłączone do portu szeregowego, to urządzenie nie może się już komunikować. Może występować rozłączenie samego łącza RS232. Sygnał DSR/DTR jest często używany do określenia połączenia lokalnego. Dzięki USB również na zdjęciu adapter USB może zostać odłączony od hosta. Musisz więc wyjaśnić, co próbujesz wykryć. Odczytywanie danych pochodzi z podłączonego urządzenia szeregowego, a nie portu szeregowego lub adaptera USB. Jeśli urządzenie jest modemem, masz inne połączenie. – sawdust

+1

Mam na myśli w szczególności przypadek odłączenia urządzenia USB od portu szeregowego od komputera-hosta. – chris12892

+1

Możesz używać libudev do oglądania zdarzeń urządzenia poprzez deskryptor pliku: http://www.signal11.us/oss/udev/ – purplepsycho

Odpowiedz

3

Przede wszystkim warto wspomnieć, że zachowanie serial-USB jest następujący:

na urządzeniu USB unplugged rozłączeniem nazywa

@disconnect: Wywoływana, gdy interfejs nie jest już dostępny, zwykle , ponieważ jego urządzenie zostało (lub jest) rozłączone lub moduł sterownika jest rozładowywany.

w naszym przypadku jest to usb_serial_disconnect (struct usb_interface * interfejs)

który calles usb_serial_console_disconnect (Serial), który calles tty_hangup ... i tak dalej.

Możesz śledzić łańcuch zaczął stąd: http://lxr.free-electrons.com/source/drivers/usb/serial/usb-serial.c#L1091

W skrócie to powoduje następujące klasyczny sposób:

sygnałów pselect że deskryptor pliku jest gotowy i ioctl (fd, FIONREAD, & len) zwraca zero len.

Odłączono urządzenie.

Summurizing (pochodzące z kodu):

while(1) 
{ 
    FD_ZERO(&rfds); 
    FD_SET(tty_fd, &rfds); 

    // have tried checking fcntl(tty_fd, F_GETFL); too 

    // Blocking call to wait until we have data 
    int ready = select(tty_fd + 1, &rfds, NULL, NULL, NULL); 

    if(ready && FD_ISSET(tty_fd, &rfds)) { 
     size_t len = 0; 
     ioctl(tty_fd, FIONREAD, &len); 
     errsv = errno; 

     if(len == 0) 
     { 
     printf("prog_name: zero read from the device: %s.", strerror(errsv)); 
     /* close fd and cleanup or reconnect etc...*/ 
     exit(EXIT_FAILURE); 
     } 

     // While we have data, collect it 
     while (read(tty_fd, &c, 1)>0 && bytesRead++<200) 
     { 
     serialBuffer.push_back(c); 
     } 

     bytesRead = 0; 

     // Try to parse it 
     BufferParse(); 
    } 
} 

Szkoda, że ​​nie powiedzieć, jakiego rodzaju urządzenia używasz.

W przypadku, gdy urządzenie może sterować przepływem RTS/CTS, możliwe jest również wykrywanie przerwy w linii.

+0

Hej, dzięki za szczegółowy komentarz! Urządzenie jest chipem FTDI dołączonym do Raspberry Pi. Raspian Jessie, jeśli dystrybucja ma znaczenie. Spróbuję tego nieco później i zaktualizuję, jak to działało. – chris12892

+0

Hah! To działa pięknie! Dzięki wielkie! – chris12892

+0

Np, właściwie zero odczytu pochodzi z zastąpienia domyślnych procedur obsługi oportunistycznych z próbnymi, które zwracają zero przy odczycie. Jest to prawie takie samo zachowanie jak gniazda. – Maquefel