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