estructura SERIAL_TIMEOUTS (ntddser.h)
La estructura SERIAL_TIMEOUTS especifica los parámetros de tiempo de espera para las operaciones de lectura y escritura por el puerto serie.
Sintaxis
typedef struct _SERIAL_TIMEOUTS {
ULONG ReadIntervalTimeout;
ULONG ReadTotalTimeoutMultiplier;
ULONG ReadTotalTimeoutConstant;
ULONG WriteTotalTimeoutMultiplier;
ULONG WriteTotalTimeoutConstant;
} SERIAL_TIMEOUTS, *PSERIAL_TIMEOUTS;
Miembros
ReadIntervalTimeout
Cantidad máxima de tiempo, en milisegundos, que se permite entre dos bytes consecutivos en una operación de lectura. Operación de lectura que supera este tiempo de espera máximo. Este máximo no se aplica al intervalo de tiempo que precede a la lectura del primer byte. Un valor de cero indica que no se usan tiempos de espera de intervalo. Para obtener más información, vea la sección Comentarios.
ReadTotalTimeoutMultiplier
Cantidad máxima de tiempo, en milisegundos, que se permite por byte en una operación de lectura. Operación de lectura que supera este tiempo de espera máximo. Para obtener más información, vea Comentarios.
ReadTotalTimeoutConstant
Cantidad máxima de tiempo adicional, en milisegundos, que se permite por operación de lectura. Operación de lectura que supera este tiempo de espera máximo. Para obtener más información, vea Comentarios.
WriteTotalTimeoutMultiplier
Tiempo total máximo, en milisegundos, que se permite por byte en una operación de escritura. Operación de escritura que supera este tiempo de espera máximo. Para obtener más información, vea Comentarios.
WriteTotalTimeoutConstant
Cantidad máxima de tiempo adicional, en milisegundos, que se permite por operación de escritura. Operación de escritura que supera este tiempo de espera máximo. Para obtener más información, vea Comentarios.
Comentarios
La estructura de SERIAL_TIMEOUTS se usa en las solicitudes de control de E/S de IOCTL_SERIAL_SET_TIMEOUTS y IOCTL_SERIAL_GET_TIMEOUTS . Una solicitud de control de E/S de IOCTL_SERIAL_SET_TIMEOUTS usa esta estructura para especificar un conjunto de parámetros de tiempo de espera para que el puerto serie se use para las operaciones de lectura y escritura. Una solicitud de control de E/S de IOCTL_SERIAL_GET_TIMEOUTS usa esta estructura para recuperar los parámetros de tiempo de espera establecidos por la solicitud de IOCTL_SERIAL_SET_TIMEOUTS anterior.
Una solicitud de lectura o escritura se completa correctamente cuando se transfiere el número especificado de bytes o se agota el tiempo de espera de la operación de lectura o escritura solicitada. La solicitud devuelve el código de estado STATUS_SUCCESS para indicar que se ha transferido el número especificado de bytes. La solicitud devuelve el código de estado STATUS_TIMEOUT para indicar que se agota el tiempo de espera de la operación.
Si una solicitud de IRP_MJ_READ especifica una operación de lectura que es Ntₒtₐl bytes de longitud, la cantidad máxima de tiempo, Tmₐₓ, que el puerto serie permite que la operación se complete se calcula de la siguiente manera:
Tmₐₓ = Ntₒtₐl * ReadTotalTimeoutMultiplier + ReadTotalTimeoutConstant
Una solicitud de lectura que supera este máximo se completa cuando se produce el tiempo de espera y devuelve el código de estado STATUS_TIMEOUT. El campo Información del bloque de estado de E/S indica el número de bytes leídos correctamente antes de que se produjera el tiempo de espera.
Si una solicitud IRP_MJ_WRITE especifica una operación de escritura que es Ntₒtₐl bytes de longitud, la cantidad máxima de tiempo, Tmₐₓ, que el puerto serie permite que la operación se complete se calcula de la siguiente manera:
Tmₐₓ = Ntₒtₐl * WriteTotalTimeoutMultiplier + WriteTotalTimeoutConstant
Una solicitud de escritura que supera este máximo se completa cuando se produce el tiempo de espera y devuelve el código de estado STATUS_TIMEOUT. El campo Información del bloque de estado de E/S indica el número de bytes escritos correctamente antes de que se produjera el tiempo de espera.
El tiempo máximo, Tmₐₓ, que se permite que se complete una operación de lectura o escritura siempre se mide desde cuando el puerto serie inicia la operación solicitada y no desde cuando el cliente envía la solicitud.
Si ReadIntervalTimeout, ReadTotalTimeoutMultiplier y ReadTotalTimeoutConstant son cero, las operaciones de lectura nunca agota el tiempo de espera. Si WriteTotalTimeoutMultiplier y WriteTotalTimeoutConstant son cero, las operaciones de escritura nunca agotan el tiempo de espera.
Si ReadIntervalTimeout es cero, no hay ningún intervalo máximo entre bytes consecutivos en las operaciones de lectura y los tiempos de espera se basan únicamente en los miembros ReadTotalTimeoutMultiplier y ReadTotalTimeoutConstant .
Si ReadTotalTimeoutMultiplier y ReadTotalTimeoutConstant son cero y ReadIntervalTimeout es menor que MAXULONG y mayor que cero, una operación de lectura agota el tiempo de espera solo si el intervalo entre un par de bytes recibidos consecutivamente supera ReadIntervalTimeout. Si se usan estos tres valores de tiempo de espera y el búfer de entrada del puerto serie está vacío cuando se envía una solicitud de lectura al puerto, esta solicitud nunca agota el tiempo de espera hasta que el puerto reciba al menos un byte de datos nuevos.
Si ReadIntervalTimeout se establece en MAXULONG y ReadTotalTimeoutConstant y ReadTotalTimeoutMultiplier son cero, una solicitud de lectura se completa inmediatamente con los bytes que ya se han recibido, incluso si no se han recibido bytes. En este caso, la solicitud de lectura devuelve el código de estado STATUS_SUCCESS.
Si ReadIntervalTimeout y ReadTotalTimeoutMultiplier se establecen en MAXULONG y ReadTotalTimeoutConstant se establece en un valor mayor que cero y menor que MAXULONG, una solicitud de lectura se comporta de la siguiente manera:
- Si hay bytes en el búfer de entrada del puerto serie, la solicitud de lectura se completa inmediatamente con los bytes que están en el búfer y devuelve el código de estado STATUS_SUCCESS.
- Si no hay bytes en el búfer de entrada, el puerto serie espera hasta que llega un byte y, a continuación, completa inmediatamente la solicitud de lectura con el byte de datos y devuelve el código de estado de STATUS_SUCCESS.
- Si no llegan bytes dentro del tiempo especificado por ReadTotalTimeoutConstant, la solicitud de lectura agota el tiempo de espera, establece el campo Información del bloque de estado de E/S en cero y devuelve el código de estado de STATUS_TIMEOUT.
Se puede usar un tiempo de espera de intervalo de lectura para detectar el final de un flujo de datos entrante cuando no se conoce con antelación la longitud del flujo de datos. Si una solicitud de lectura usa esta técnica, un código de estado de finalización STATUS_TIMEOUT normalmente significa que la solicitud se completó correctamente.
Se produce un tiempo de espera de intervalo de lectura cuando el intervalo entre bytes entrantes supera el valor ReadIntervalTimeout . Los intervalos de tiempo de espera se miden en relación con el reloj del sistema y la precisión de la medida de tiempo de espera está limitada por la granularidad del reloj del sistema. Como resultado, se puede producir un tiempo de espera entre un tic del reloj del sistema antes y un tic posterior al intervalo de tiempo de espera especificado, dependiendo de dónde se encuentran exactamente las horas de inicio y finalización de este intervalo entre los tics del reloj del sistema. Los tiempos de espera pueden producirse incluso más tarde si el procesamiento de interrupciones del reloj del sistema se retrasa mediante el procesamiento de interrupciones para otros dispositivos. Si un intervalo de tiempo de espera especificado está cerca o menor que el período entre los tics del reloj del sistema, el tiempo de espera puede producirse inmediatamente, sin retraso.
Una posible manera de medir con mayor precisión los intervalos de tiempo de espera más pequeños es reducir el tiempo entre los tics del reloj del sistema, pero es probable que esto aumente el consumo de energía. Además, reducir el período de reloj del sistema podría no lograr de forma confiable una granularidad más fina del reloj del sistema a menos que se pueda garantizar el procesamiento relacionado con interrupciones por parte de los distintos controladores de la plataforma para no retrasar el procesamiento de interrupciones del reloj del sistema.
La estructura de SERIAL_TIMEOUTS es similar a la estructura COMMTIMEOUTS , que usa las funciones SetCommTimeouts y GetCommTimeouts en modo de usuario.
Para obtener más información, vea Establecer tiempos de espera de lectura y escritura para un dispositivo serie.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Se admite a partir de Windows 2000. |
Encabezado | ntddser.h |