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