串行 I/O 请求接口

若要控制连接到串行控制器上的端口的外围设备,客户端应用程序或外围设备驱动程序会将 I/O 请求发送到该端口。 客户端使用 IRP_MJ_WRITEIRP_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

IOCTL_SERIAL_APPLY_DEFAULT_CONFIGURATION

IOCTL_SERIAL_CLEAR_STATS

IOCTL_SERIAL_CLR_DTR

见第 1 条注释。

IOCTL_SERIAL_CLR_RTS

IOCTL_SERIAL_CONFIG_SIZE

IOCTL_SERIAL_GET_BAUD_RATE

IOCTL_SERIAL_GET_CHARS

请参阅注释 2。

IOCTL_SERIAL_GET_COMMSTATUS

IOCTL_SERIAL_GET_DTRRTS

IOCTL_SERIAL_GET_HANDFLOW

见第 1 条注释。

IOCTL_SERIAL_GET_LINE_CONTROL

IOCTL_SERIAL_GET_MODEM_CONTROL (请参阅注释 4.)

IOCTL_SERIAL_GET_MODEMSTATUS

IOCTL_SERIAL_GET_PROPERTIES

IOCTL_SERIAL_GET_STATS

IOCTL_SERIAL_GET_TIMEOUTS

IOCTL_SERIAL_GET_WAIT_MASK

IOCTL_SERIAL_IMMEDIATE_CHAR

IOCTL_SERIAL_LSRMST_INSERT

IOCTL_SERIAL_PURGE

IOCTL_SERIAL_RESET_DEVICE (请参阅注释 5.)

IOCTL_SERIAL_SET_BAUD_RATE

IOCTL_SERIAL_SET_BREAK_OFF

IOCTL_SERIAL_SET_BREAK_ON

IOCTL_SERIAL_SET_CHARS

请参阅注释 2。

IOCTL_SERIAL_SET_DTR

见第 1 条注释。

IOCTL_SERIAL_SET_FIFO_CONTROL

见第 1 条注释。

IOCTL_SERIAL_SET_HANDFLOW (请参阅注释 3.)

IOCTL_SERIAL_SET_LINE_CONTROL

IOCTL_SERIAL_SET_MODEM_CONTROL (请参阅注释 4.)

IOCTL_SERIAL_SET_QUEUE_SIZE

IOCTL_SERIAL_SET_RTS

IOCTL_SERIAL_SET_TIMEOUTS

IOCTL_SERIAL_SET_WAIT_MASK

IOCTL_SERIAL_SET_XOFF

IOCTL_SERIAL_SET_XON

IOCTL_SERIAL_WAIT_ON_MASK

IOCTL_SERIAL_XOFF_COUNTER

**笔记**
  1. SerCx2 可能支持此 IOCTL,也可能不支持此 IOCTL,具体取决于串行控制器驱动程序的实现和串行控制器硬件的功能。

  2. SerCx2 不支持特殊字符。 SerCx2 始终使用 STATUS_SUCCESS 状态代码完成IOCTL_SERIAL_SET_CHARS请求,但不设置任何特殊字符或执行任何其他操作来响应此请求。 对于 IOCTL_SERIAL_GET_CHARS 请求,SerCx2 将 SERIAL_CHARS 结构中的所有字符值设置为 null,并使用STATUS_SUCCESS状态代码完成请求。

  3. SerCx2 和 SerCx 仅支持为 SERIAL_HANDFLOW 结构的 FlowReplaceControlHandShake 成员定义的标志子集。 Serial.sys支持所有这些标志。 有关详细信息,请参阅 SERIAL_HANDFLOW

  4. IOCTL_SERIAL_GET_MODEM_CONTROLIOCTL_SERIAL_SET_MODEM_CONTROL请求主要用于硬件测试。 没有为调制解调器控制操作定义标准寄存器布局。 使用调制解调器控制 IOCTL 的外围驱动程序可能会使自身依赖于特定串行控制器的硬件功能。

  5. Serial.sys驱动程序始终使用 STATUS_SUCCESS完成IOCTL_SERIAL_RESET_DEVICE 请求,但不执行任何操作来响应此请求。 SerCx2 和 SerCx 不支持 IOCTL_SERIAL_RESET_DEVICE 请求,并且始终使用STATUS_NOT_IMPLEMENTED完成这些请求。

有关 串行控制器IOCTL_SERIAL_XXX 请求以及读取和写入请求的详细信息,请参阅 ntddser.h 标头。