串口IOCTL_SERIAL_PURGE及 PurgeComm
2023-06-19
142
0
在Windows系统中,IOCTL_SERIAL_PURGE 是指清空串口设备的读写缓冲区的 IOCTL 码。使用该 IOCTL 命令可以清空串口设备的读写缓冲区并丢弃其中的所有数据。
该 IOCTL 命令可以用于以下情况:
- 丢弃全部的写缓冲数据,以确保不会发送任何未完成的数据。
- 丢弃全部的读缓冲数据,确保从一个干净的状态开始。
- 丢弃保存在硬件 FIFO 内部的全部未传输数据。
重要提示:需要注意的是,执行该 IOCTL 命令时会清空串口设备的读写缓冲区并丢弃其中所有数据,如果设备正在传输数据,该操作会导致数据丢失。因此,在执行该命令前应当先将数据从缓冲区读取出来并处理完毕,以避免数据丢失。
if (IoControlCode == IOCTL_SERIAL_PURGE)
{
IoStack->Parameters.DeviceIoControl.InputBufferLength == 4;
KdPrint(("IOCTL_SERIAL_PURGE\n"));
PULONG pMask = (PULONG)Irp->AssociatedIrp.SystemBuffer;
KdPrint(("purge mask=0x%x\n", pMask[0]));
}
在Win32 API中,IOCTL_SERIAL_PURGE 对应的函数是 PurgeComm()。PurgeComm() 函数用于清空串口设备的读写缓冲区。调用该函数会清空串口设备的读写缓冲区并丢弃其中的所有数据,它可以完成如下操作:
- 清空串口设备的输入缓冲区。
- 清空串口设备的输出缓冲区。
- 丢弃串口设备中保存的所有未传输数据。
PurgeComm() 函数的语法如下:
BOOL PurgeComm(
HANDLE hFile,
DWORD dwFlags
);
其中,hFile 参数是串口设备的句柄,dwFlags 参数可以取以下值:
- PURGE_TXABORT:清空输出缓冲区并取消所有挂起的写操作。
- PURGE_RXABORT:清空输入缓冲区并取消所有挂起的读操作。
- PURGE_TXCLEAR:清空输出缓冲区。
- PURGE_RXCLEAR:清空输入缓冲区。
这些标志可以组合使用,比如,要清空输入缓冲区和输出缓冲区,可以把 dwFlags 参数设置为 PURGE_RXCLEAR | PURGE_TXCLEAR。
函数返回值为 BOOL 类型,如果函数执行成功,则返回值为 TRUE,否则返回值为 FALSE。