via serial minicom application linux serial-port

linux - serial - termios VMIN VTIME y operaciones de lectura de bloqueo/no bloqueo



shell serial port linux (3)

Recomiendo usar vmin y vtime ambos 0 si está utilizando lecturas sin bloqueo. Eso le dará el comportamiento de que si los datos están disponibles, se devolverán; el fd estará listo para seleccionar, sondear, etc. cuando haya datos disponibles.

vmin y vtime son útiles si estás haciendo lecturas de bloqueo. Por ejemplo, si está esperando un tamaño de paquete en particular, puede configurar vmin. Si quiere asegurarse de obtener datos cada medio segundo, puede establecer el tiempo de transmisión.

Obviamente, vmin y vtime son solo para modo no canónico (modo no lineal)

Mi sospecha es que en el modo sin bloqueo si establece vmin decir 5, entonces el fd no estará listo para lectura y read devolverá EWOULDBLOCK hasta que los 5 caracteres estén listos. No sé y no tengo un caso de prueba fácil de probar, porque todo el trabajo en serie que he hecho ha sido de bloqueo o ha configurado ambos en 0.

Estoy tratando de escribir un simple programa de comunicación en serie C para Linux. Estoy confundido acerca de las lecturas de bloqueo / no bloqueo y las relaciones VMIN / VTIME.

Mi pregunta es, si debería ser la configuración VMIN / VTIME según si tengo una llamada abierta de bloqueo / no bloqueo.

Por ejemplo, si tengo la siguiente llamada abierta:

open( "/dev/ttyS0", O_RDWR|O_NONBLOCK|O_NOCTTY)

¿Debo configurar el VMIN / VTIME a:

.c_cc[VTIME] = 0; .c_cc[VMIN] = 0;

y si tengo modo de bloqueo como:

open( "/dev/ttyS0", O_RDWR|O_NOCTTY)

¿Debo configurar el VMIN / VTIME a:

.c_cc[VTIME] = 0; .c_cc[VMIN] = 1;

?

¿Hay alguna diferencia en cuanto a qué VMIN / VTIME se establece a pesar de que los indicadores de apertura del puerto están configurados correctamente?

Si alguien pudiera ayudarme a entender la relación entre VMIN / VTIME y los puertos de bloqueo / no bloqueo, realmente lo agradecería.

Gracias



Andrey tiene razón En el modo sin bloqueo, VMIN / VTIME no tiene ningún efecto (FNDELAY / O_NDELAY parecen ser variantes de linux de O_NONBLOCK, el indicador POSIX portátil).

Al usar select () con un archivo en modo no bloqueante, se obtiene un evento por cada byte que llega. A altas velocidades de datos en serie, esto martilla la CPU. Es mejor usar el modo de bloqueo con VMIN, de modo que select () espera un bloque de datos antes de disparar un evento, y VTIME para limitar el retraso, para bloques más pequeños que VMIN.

Sam dijo "Si quieres asegurarte de obtener datos cada medio segundo, puedes establecer el tiempo de transmisión" (VTIME = 5).

Intuitivamente, puede esperar que sea cierto, pero no lo es. La página man de BSD termios lo explica mejor que Linux (aunque ambos funcionan de la misma manera). El temporizador VTIME es un temporizador interbyte . Comienza de nuevo con cada nuevo byte que llega al puerto serie. En el peor de los casos, select () puede esperar hasta 20 segundos antes de disparar un evento.

Supongamos que tiene VMIN = 250, VTIME = 1 y puerto serie a 115200 bps. Supongamos también que tiene un dispositivo conectado que envía bytes individuales lentamente, a una velocidad constante de 9 cps. El tiempo entre bytes es 0.11 segundos, el tiempo suficiente para que el temporizador de interbyte de 0.10 expire y seleccione () para informar un evento legible para cada byte. Todo está bien.

Ahora suponga que su dispositivo aumenta su velocidad de salida a 11 cps. El tiempo entre bytes es 0.09 segundos. No es suficiente para que expire el temporizador de interbyte, y con cada nuevo byte, comienza de nuevo. Para obtener un evento legible, VMIN = 250 debe estar satisfecho. A 11 cps, eso demora 22.7 segundos. Puede parecer que su dispositivo se ha estancado, pero el diseño de VTIME es la causa real de la demora.

Probé esto con dos scripts Perl, emisor y receptor, una tarjeta serie de dos puertos y un cable de módem nulo. Probé que funciona como dice la página del manual. VTIME es un temporizador interbyte que se restablece con la llegada de cada nuevo byte.

Un mejor diseño tendría el temporizador anclado, sin rodar. Continuaría funcionando hasta que caduque, o VMIN está satisfecho, lo que ocurra primero. El diseño existente podría arreglarse, pero hay 30 años de legado que superar.

En la práctica, es posible que rara vez se encuentre con tal escenario. Pero acecha, así que ten cuidado.