estrutura SERIAL_TIMEOUTS (ntddser.h)
A estrutura SERIAL_TIMEOUTS especifica os parâmetros de tempo limite para operações de leitura e gravação pela porta serial.
Sintaxe
typedef struct _SERIAL_TIMEOUTS {
ULONG ReadIntervalTimeout;
ULONG ReadTotalTimeoutMultiplier;
ULONG ReadTotalTimeoutConstant;
ULONG WriteTotalTimeoutMultiplier;
ULONG WriteTotalTimeoutConstant;
} SERIAL_TIMEOUTS, *PSERIAL_TIMEOUTS;
Membros
ReadIntervalTimeout
A quantidade máxima de tempo, em milissegundos, permitida entre dois bytes consecutivos em uma operação de leitura. Uma operação de leitura que excede esse tempo limite máximo. Esse máximo não se aplica ao intervalo de tempo que precede a leitura do primeiro byte. Um valor zero indica que os tempos limite de intervalo não são usados. Para obter mais informações, consulte Comentários.
ReadTotalTimeoutMultiplier
A quantidade máxima de tempo, em milissegundos, que é permitida por byte em uma operação de leitura. Uma operação de leitura que excede esse tempo limite máximo. Para obter mais informações, consulte Comentários.
ReadTotalTimeoutConstant
A quantidade máxima de tempo adicional, em milissegundos, que é permitida por operação de leitura. Uma operação de leitura que excede esse tempo limite máximo. Para obter mais informações, consulte Comentários.
WriteTotalTimeoutMultiplier
O tempo total máximo, em milissegundos, permitido por byte em uma operação de gravação. Uma operação de gravação que excede esse tempo limite máximo. Para obter mais informações, consulte Comentários.
WriteTotalTimeoutConstant
A quantidade máxima de tempo adicional, em milissegundos, que é permitida por operação de gravação. Uma operação de gravação que excede esse tempo limite máximo. Para obter mais informações, consulte Comentários.
Comentários
A estrutura de SERIAL_TIMEOUTS é usada pelas solicitações de controle de E/ S IOCTL_SERIAL_SET_TIMEOUTS e IOCTL_SERIAL_GET_TIMEOUTS . Uma solicitação de controle de E/S IOCTL_SERIAL_SET_TIMEOUTS usa essa estrutura para especificar um conjunto de parâmetros de tempo limite para a porta serial a ser usada para operações de leitura e gravação. Uma solicitação de controle de E/S IOCTL_SERIAL_GET_TIMEOUTS usa essa estrutura para recuperar os parâmetros de tempo limite definidos pela solicitação de IOCTL_SERIAL_SET_TIMEOUTS anterior.
Uma solicitação de leitura ou gravação é concluída com êxito quando o número especificado de bytes é transferido ou a operação de leitura ou gravação solicitada atinge o tempo limite. A solicitação retorna o código STATUS_SUCCESS status para indicar que o número especificado de bytes foi transferido. A solicitação retorna o código STATUS_TIMEOUT status para indicar que a operação atingiu o tempo limite.
Se uma solicitação IRP_MJ_READ especificar uma operação de leitura que seja Ntₒtₐl bytes de comprimento, a quantidade máxima de tempo, Tmₐₓ, que a porta serial permite que a operação seja concluída é calculada da seguinte maneira:
Tmₐₓ = Ntₒtₐl * ReadTotalTimeoutMultiplier + ReadTotalTimeoutConstant
Uma solicitação de leitura que excede esse máximo é concluída quando o tempo limite ocorre e retorna o código STATUS_TIMEOUT status. O campo Informações do bloco de status de E/S indica o número de bytes lidos com êxito antes do tempo limite ocorrer.
Se uma solicitação IRP_MJ_WRITE especificar uma operação de gravação que seja Ntₒtₐl bytes de comprimento, a quantidade máxima de tempo, Tmₐₓ, que a porta serial permite que a operação seja concluída é calculada da seguinte maneira:
Tmₐₓ = Ntₒtₐl * WriteTotalTimeoutMultiplier + WriteTotalTimeoutConstant
Uma solicitação de gravação que excede esse máximo é concluída quando o tempo limite ocorre e retorna o código STATUS_TIMEOUT status. O campo Informações do bloco status de E/S indica o número de bytes gravados com êxito antes do tempo limite ocorrer.
O tempo máximo, Tmₐₓ, que é permitido para uma operação de leitura ou gravação ser concluída é sempre medido a partir de quando a porta serial inicia a operação solicitada e não de quando o cliente envia a solicitação.
Se ReadIntervalTimeout, ReadTotalTimeoutMultiplier e ReadTotalTimeoutConstant forem todos zero, as operações de leitura nunca chegarão ao tempo limite. Se WriteTotalTimeoutMultiplier e WriteTotalTimeoutConstant forem zero, as operações de gravação nunca chegarão ao tempo limite.
Se ReadIntervalTimeout for zero, não haverá intervalo máximo entre bytes consecutivos em operações de leitura e os tempos limite serão baseados exclusivamente nos membros ReadTotalTimeoutMultiplier e ReadTotalTimeoutConstant .
Se ReadTotalTimeoutMultiplier e ReadTotalTimeoutConstant forem zero e ReadIntervalTimeout for menor que MAXULONG e maior que zero, uma operação de leitura atingirá o tempo limite somente se o intervalo entre um par de bytes recebidos consecutivamente exceder ReadIntervalTimeout. Se esses três valores de tempo limite forem usados e o buffer de entrada da porta serial estiver vazio quando uma solicitação de leitura for enviada para a porta, essa solicitação nunca atingirá o tempo limite até que a porta receba pelo menos um byte de novos dados.
Se ReadIntervalTimeout estiver definido como MAXULONG e ReadTotalTimeoutConstant e ReadTotalTimeoutMultiplier forem zero, uma solicitação de leitura será concluída imediatamente com os bytes que já foram recebidos, mesmo que nenhum bytes tenha sido recebido. Nesse caso, a solicitação de leitura retorna o código STATUS_SUCCESS status.
Se ReadIntervalTimeout e ReadTotalTimeoutMultiplier estiverem definidos como MAXULONG e ReadTotalTimeoutConstant for definido como um valor maior que zero e menor que MAXULONG, uma solicitação de leitura se comportará da seguinte maneira:
- Se houver bytes no buffer de entrada da porta serial, a solicitação de leitura será concluída imediatamente com os bytes que estão no buffer e retornará o código STATUS_SUCCESS status.
- Se não houver bytes no buffer de entrada, a porta serial aguardará até que um byte chegue e, em seguida, concluirá imediatamente a solicitação de leitura com um byte de dados e retornará o código STATUS_SUCCESS status.
- Se nenhum bytes chegar dentro do tempo especificado por ReadTotalTimeoutConstant, a solicitação de leitura atingirá o tempo limite, definirá o campo Informações do bloco de status de E/S como zero e retornará o código STATUS_TIMEOUT status.
Um tempo limite de intervalo de leitura pode ser usado para detectar o fim de um fluxo de dados de entrada quando o comprimento do fluxo de dados não é conhecido com antecedência. Se uma solicitação de leitura usar essa técnica, uma conclusão STATUS_TIMEOUT status código geralmente significa que a solicitação foi concluída com êxito.
Um tempo limite de intervalo de leitura ocorre quando o intervalo entre bytes de entrada excede o valor readIntervalTimeout . Os intervalos de tempo limite são medidos em relação ao relógio do sistema e a precisão da medida de tempo limite é limitada pela granularidade do relógio do sistema. Como resultado, um tempo limite pode ocorrer entre um tique de relógio do sistema mais cedo e um tique posterior ao intervalo de tempo limite especificado, dependendo de onde exatamente os horários de início e término desse intervalo caem entre os tiques do relógio do sistema. Os tempos limite poderão ocorrer ainda mais tarde se o processamento de interrupção do relógio do sistema for atrasado por meio do processamento de interrupção para outros dispositivos. Se um intervalo de tempo limite especificado for próximo ou menor que o período entre os tiques do relógio do sistema, o tempo limite poderá ocorrer imediatamente, sem atraso.
Uma maneira possível de medir com mais precisão intervalos de tempo limite menores é diminuir o tempo entre os tiques do relógio do sistema, mas isso provavelmente aumentará o consumo de energia. Além disso, a redução do período do relógio do sistema pode não atingir de forma confiável uma granularidade mais fina do relógio do sistema, a menos que o processamento relacionado à interrupção pelos vários drivers na plataforma possa ser garantido para não atrasar o processamento de interrupções do relógio do sistema.
A estrutura SERIAL_TIMEOUTS é semelhante à estrutura COMMTIMEOUTS , que é usada pelas funções SetCommTimeouts e GetCommTimeouts do modo de usuário.
Para obter mais informações, consulte Configurando tempos limite de leitura e gravação para um dispositivo serial.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Com suporte a partir do Windows 2000. |
Cabeçalho | ntddser.h |