串行 I/O 请求接口
若要控制连接到串行控制器上的端口的外围设备,客户端应用程序或外围设备驱动程序会将 I/O 请求发送到该端口。 客户端使用 IRP_MJ_WRITE 和 IRP_MJ_READ 请求将数据传输到串行端口以及从串行端口接收数据。 此外,Windows 定义一组串行 I/O 控制请求, (IOCTL) 客户端可用于配置串行端口。
串行 IRP_MJ_XXX 请求和串行 IOCTL 共同构成了跨一系列串行控制器设备支持的串行 I/O 请求接口。 Serial.sys驱动程序以及 SerCx2 或 SerCx 和基于扩展的串行控制器驱动程序的组合支持此接口。
SerCx2、SerCx 和 Serial.sys支持许多相同的串行 IOCTL。 但是,SerCx2、SerCx 和 Serial.sys支持 串行设备控制请求中指定的 IOCTL 的不同子集。 下表汇总了 SerCx2、SerCx 和 Serial.sys支持的 IOCTL 子集。 表中的 “是” 条目表示串行框架扩展或驱动程序支持相应的 IOCTL,而 “否 ”条目表示不支持。
串行 IOCTL | SerCx2 | SerCx | Serial.sys |
---|---|---|---|
是 |
是 |
否 |
|
否 |
是 |
是 |
|
见第 1 条注释。 |
是 |
是 |
|
是 |
是 |
是 |
|
否 |
否 |
是 |
|
是 |
是 |
是 |
|
请参阅注释 2。 |
是 |
是 |
|
是 |
是 |
是 |
|
是 |
是 |
是 |
|
见第 1 条注释。 |
是 |
是 |
|
是 |
是 |
是 |
|
IOCTL_SERIAL_GET_MODEM_CONTROL (请参阅注释 4.) |
是 |
是 |
是 |
否 |
是 |
是 |
|
是 |
是 |
是 |
|
否 |
是 |
是 |
|
是 |
是 |
是 |
|
是 |
是 |
是 |
|
否 |
是 |
是 |
|
否 |
是 |
是 |
|
是 |
是 |
是 |
|
IOCTL_SERIAL_RESET_DEVICE (请参阅注释 5.) |
否 |
否 |
是 |
是 |
是 |
是 |
|
是 |
是 |
是 |
|
是 |
是 |
是 |
|
请参阅注释 2。 |
是 |
是 |
|
见第 1 条注释。 |
是 |
是 |
|
见第 1 条注释。 |
是 |
是 |
|
IOCTL_SERIAL_SET_HANDFLOW (请参阅注释 3.) |
是 |
是 |
是 |
是 |
是 |
是 |
|
IOCTL_SERIAL_SET_MODEM_CONTROL (请参阅注释 4.) |
是 |
是 |
是 |
是 |
是 |
是 |
|
是 |
是 |
是 |
|
是 |
是 |
是 |
|
是 |
是 |
是 |
|
否 |
是 |
是 |
|
否 |
是 |
是 |
|
是 |
是 |
是 |
|
否 |
是 |
是 |
SerCx2 可能支持此 IOCTL,也可能不支持此 IOCTL,具体取决于串行控制器驱动程序的实现和串行控制器硬件的功能。
SerCx2 不支持特殊字符。 SerCx2 始终使用 STATUS_SUCCESS 状态代码完成IOCTL_SERIAL_SET_CHARS请求,但不设置任何特殊字符或执行任何其他操作来响应此请求。 对于 IOCTL_SERIAL_GET_CHARS 请求,SerCx2 将 SERIAL_CHARS 结构中的所有字符值设置为 null,并使用STATUS_SUCCESS状态代码完成请求。
SerCx2 和 SerCx 仅支持为 SERIAL_HANDFLOW 结构的 FlowReplace 和 ControlHandShake 成员定义的标志子集。 Serial.sys支持所有这些标志。 有关详细信息,请参阅 SERIAL_HANDFLOW。
IOCTL_SERIAL_GET_MODEM_CONTROL和IOCTL_SERIAL_SET_MODEM_CONTROL请求主要用于硬件测试。 没有为调制解调器控制操作定义标准寄存器布局。 使用调制解调器控制 IOCTL 的外围驱动程序可能会使自身依赖于特定串行控制器的硬件功能。
Serial.sys驱动程序始终使用 STATUS_SUCCESS完成IOCTL_SERIAL_RESET_DEVICE 请求,但不执行任何操作来响应此请求。 SerCx2 和 SerCx 不支持 IOCTL_SERIAL_RESET_DEVICE 请求,并且始终使用STATUS_NOT_IMPLEMENTED完成这些请求。
有关 串行控制器IOCTL_SERIAL_XXX 请求以及读取和写入请求的详细信息,请参阅 ntddser.h 标头。