通过 IOCP 进行串行通信
Posted
技术标签:
【中文标题】通过 IOCP 进行串行通信【英文标题】:Serial Comms via IOCP 【发布时间】:2009-03-23 15:41:24 【问题描述】:是否可以将 IO 完成端口用于串行 I/O?根据 Windows 通过 C/C++ 暗示这是可能的,并且确实给出了一个使用 IOCP 和物理文件的示例,显示与 CreateFile、ReadFile、WriteFile 等一起使用。但是这实际上可以与串行通信一起使用吗?有用吗?
我在网上找不到任何这样的例子,但我不是第一个尝试它的人吗?
【问题讨论】:
【参考方案1】:是的,使用串行 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()
函数异步检索其他串行端口特定事件。
【讨论】:
啊。我没有使用 GetCommTimeouts,这可能是我出错的地方 - 我可以建立连接但不能传递任何东西。 CancelIo() 完全损坏。请参阅***.com/questions/3921111/… 了解更多信息。以上是关于通过 IOCP 进行串行通信的主要内容,如果未能解决你的问题,请参考以下文章