通过IOCP串行通信

时间:2009-03-23 15:41:24

标签: windows serial-port iocp

是否可以将IO完成端口用于串行I / O?根据Windows通过C / C ++,它提到它是可能的,并且确实提供了一个使用IOCP与物理文件显示使用CreateFile,ReadFile,WriteFile等的例子。但是这实际上可以用于串行通信 - 有任何人得到它有效吗?

我在网上找不到任何这方面的例子,但我不能成为第一个尝试它的人吗?

1 个答案:

答案 0 :(得分:3)

是的,使用I / O完成端口进行串行I / O工作正常。为适合IOCP的串行端口创建文件句柄需要一些设置工作。但是一旦设置完成,您就可以执行异步ReadFile()WriteFile()操作,就像使用常规文件句柄和套接字句柄一样。

设置基本上是:

  1. 打开CreateFile()串行端口,将FILE_FLAG_OVERLAPPED值作为dwFlagsAndAttributes参数传递。
  2. 使用GetCommState()SetCommState()根据需要修改串行端口状态。这样做就像你不使用IOCP时那样。
  3. 使用GetCommTimeouts()SetCommTimeouts()关闭读取操作的总超时,因为异步操作的超时通常没有意义。 (相反,您应明确调用CancelIO()取消读取操作。)通过将ReadTotalTimeoutMultiplier结构的ReadTotalTimeoutConstantCOMMTIMEOUTS字段设置为关闭来完成总超时零。
  4. 现在,您可以像使用常规文件句柄和套接字句柄一样使用IOCP句柄。即使用CreateIoCompletionPort()将句柄附加到完成端口,使用ReadFile()结构使用WriteFile()OVERLAPPED启动I / O操作,从完成中取消已完成,失败或取消的操作端口使用GetQueuedCompletionStatus()函数。

    还可以使用WaitCommEvent()函数异步检索其他串行端口特定事件。