versiones serie serial puertos puerto probar habilitar com1 c++ linux serial-port termios

c++ - serie - probar puerto serial linux



Detectando si un dispositivo de caracteres se ha desconectado en Linux con termios api(c++) (1)

Estoy usando termios api en Linux para comunicarme con un dispositivo serial. Intento detectar si el dispositivo se ha desconectado, así que puedo intentar volver a conectar después de un tiempo de espera. Tengo el siguiente código de ejemplo:

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(); }

En realidad, no estoy viendo select () o fcntl return error values ​​(-1) después de que el dispositivo ttyUSB se desconecta físicamente. Podría, por supuesto, verificar si el archivo en / dev / existe, pero esperaba que hubiera una solución más elegante.

Agradecería cualquier consejo, ¡gracias!


En primer lugar, vale la pena mencionar que el comportamiento serial-usb es el siguiente:

En el dispositivo USB la desconexión desconectada se llama

@disconnect: se invoca cuando la interfaz ya no es accesible, generalmente porque su dispositivo ha sido (o está siendo) desconectado o el módulo del controlador está siendo descargado.

en nuestro caso, usb_serial_disconnect (struct interfaz usb_interface *)

que llama usb_serial_console_disconnect (serial), que dice tty_hangup ... y así sucesivamente.

Puede seguir la cadena iniciada desde aquí: http://lxr.free-electrons.com/source/drivers/usb/serial/usb-serial.c#L1091

En resumen, esto se traduce en la siguiente manera clásica:

pselect señala que el descriptor de archivo está listo y ioctl (fd, FIONREAD, y len) devuelve cero len.

Eso es todo, desenchufó el dispositivo.

Summurizing (derivado de su código):

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(); } }

Es una pena que no dijeras qué tipo de dispositivo estás usando.

En caso de que su dispositivo sea capaz de controlar el flujo RTS / CTS, también es posible detectar el salto de línea.