是否可以将 IO 完成端口用于串行 I/O?根据 Windows 通过 C/C++ 暗示这是可能的,并且确实给出了一个使用 IOCP 和物理文件的示例,显示与 CreateFile、ReadFile、WriteFile 等一起使用。但是这实际上可以与串行通信一起使用吗?它工作吗?
我在网上找不到任何这样的例子,但我不能成为第一个尝试它的人吗?
是否可以将 IO 完成端口用于串行 I/O?根据 Windows 通过 C/C++ 暗示这是可能的,并且确实给出了一个使用 IOCP 和物理文件的示例,显示与 CreateFile、ReadFile、WriteFile 等一起使用。但是这实际上可以与串行通信一起使用吗?它工作吗?
我在网上找不到任何这样的例子,但我不能成为第一个尝试它的人吗?
是的,使用串行 I/O 的 I/O 完成端口可以正常工作。为适合 IOCP 的串行端口创建文件句柄需要进行一些设置工作。但是一旦设置完成,您就可以像使用常规文件句柄和套接字句柄一样进行异步ReadFile()
和操作。WriteFile()
设置基本上是:
CreateFile()
传入,打开串口。FILE_FLAG_OVERLAPPED
dwFlagsAndAttributes
GetCommState()
使用和根据需要修改串行端口状态SetCommState()
。就像不使用 IOCP 时那样做。GetCommTimeouts()
andSetCommTimeouts()
关闭读取操作的总超时,因为异步操作的超时通常没有意义。(您将改为显式调用以取消读取操作。)通过将结构的and字段设置为零来CancelIO()
关闭总超时。ReadTotalTimeoutMultiplier
ReadTotalTimeoutConstant
COMMTIMEOUTS
现在您可以将句柄与 IOCP 一起使用,就像使用常规文件句柄和套接字句柄一样。即使用 将句柄附加到完成端口,使用或使用结构CreateIoCompletionPort()
启动 I/O 操作,使用该功能从完成端口出列已完成、失败或取消的操作。ReadFile()
WriteFile()
OVERLAPPED
GetQueuedCompletionStatus()
还可以使用该WaitCommEvent()
函数异步检索其他串行端口特定事件。