SerCx2 对读取和写入请求的处理

外围驱动程序将写入 (IRP_MJ_WRITE) 和读取 (IRP_MJ_READ) 请求发送到串行控制器上的端口,以将数据传入和传出连接到端口的外围设备。 SerCx2 处理这些请求的方式是明确定义的,即使请求超时或取消也是如此。

取消读取或写入请求

在读取或写入请求完成之前,操作系统或发送请求的外围驱动程序可能会取消此请求。 如果在 SerCx2 传输请求的任何数据之前发生取消,则 SerCx2 将使用STATUS_CANCELLED状态代码完成请求。

但是,如果在为请求传输一个或多个字节数据之后取消读取或写入请求,但在传输请求的所有数据之前,SerCx2 会使用STATUS_SUCCESS状态代码完成请求。 完成的请求报告 SerCx2 在处理请求期间读取或写入的字节数。 如有必要,发送请求的外围驱动程序可以使用此信息发送第二个请求,以完成部分完成的读取或写入操作。

超时的请求

如果读取或写入请求在处理时间过长时可能会超时。 此外,如果串行控制器连续接收的两个字节之间的时间超过允许的某个最大时间,则读取请求可能会超时。 在任一情况下,当检测到超时条件时,SerCx2 会立即使用STATUS_TIMEOUT状态代码完成请求。 完成的请求报告 SerCx2 在处理请求期间读取或写入的字节数。 如有必要,发送请求的外围驱动程序可以使用此信息发送第二个请求,以完成部分完成的读取或写入操作。 有关超时的详细信息,请参阅 SERIAL_TIMEOUTS

硬件限制的影响

通常,SerCx2 准确报告读取或写入请求传输的超时或取消的字节数。 但是,某些用于执行系统 DMA 事务的硬件可能无法准确计算部分完成的读取或写入事务传输的字节数。 如果是这样,关联的读取或写入请求可能仅报告已传输的字节的近似计数。

传输零字节的请求

为了响应传输零字节的读取或写入请求,SerCx2 使用STATUS_SUCCESS状态代码完成请求,但不执行任何操作。