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ę!
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
Mam na myśli w szczególności przypadek odłączenia urządzenia USB od portu szeregowego od komputera-hosta. – chris12892
Możesz używać libudev do oglądania zdarzeń urządzenia poprzez deskryptor pliku: http://www.signal11.us/oss/udev/ – purplepsycho