是否可以使用串行 I/O 的 IO 完成端口?根据 Windows via C/C++,它暗示这是可能的,并且确实给出了一个使用 IOCP 与物理文件的示例,显示了 CreateFile、ReadFile、WriteFile 等的工作。但是,这实际上可以与串行通信一起使用吗 - 有人知道吗?它工作吗?
我在网络上找不到任何这样的示例,但我不能是第一个尝试它的人?
最佳答案
是的,使用 I/O 完成端口进行串行 I/O 效果很好。为适合 IOCP 的串行端口创建文件句柄需要进行一些设置工作。但是一旦设置完成,就可以进行异步ReadFile()
和WriteFile()
操作就像常规文件句柄和套接字句柄一样。
设置基本上是:
- 使用
CreateFile()
打开串行端口传入FILE_FLAG_OVERLAPPED
值为dwFlagsAndAttributes
参数。 - 使用
GetCommState()
根据需要修改串行端口状态和SetCommState()
。就像不使用 IOCP 时一样执行此操作。 - 使用
GetCommTimeouts()
和SetCommTimeouts()
关闭读取操作的总超时,因为异步操作的超时通常没有意义。 (您可以显式调用CancelIO()
来取消读取操作。)通过设置ReadTotalTimeoutMultiplier
来关闭总超时。和ReadTotalTimeoutConstant
COMMTIMEOUTS
的字段结构归零。
现在您可以将句柄与 IOCP 一起使用,就像使用常规文件句柄和套接字句柄一样。 IE。使用 CreateIoCompletionPort()
将句柄连接到完成端口,使用 ReadFile()
启动 I/O 操作或WriteFile()
使用OVERLAPPED
结构,使用GetQueuedCompletionStatus()
从完成端口出列已完成、失败或取消的操作功能。
还可以使用 WaitCommEvent()
异步检索其他串行端口特定事件。功能。
关于windows - 通过 IOCP 进行串行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/673896/