通过 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 结构的ReadTotalTimeoutMultiplierReadTotalTimeoutConstant 字段设置为零来关闭总超时。

现在您可以将句柄与 IOCP 一起使用,就像使用常规文件句柄和套接字句柄一样。 IE。使用CreateIoCompletionPort() 将句柄附加到完成端口,使用ReadFile()WriteFile() 使用OVERLAPPED 结构启动I/O 操作,使用GetQueuedCompletionStatus() 函数从完成端口出列已完成、失败或取消的操作。

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

【讨论】:

啊。我没有使用 GetCommTimeouts,这可能是我出错的地方 - 我可以建立连接但不能传递任何东西。 CancelIo() 完全损坏。请参阅***.com/questions/3921111/… 了解更多信息。

以上是关于通过 IOCP 进行串行通信的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Visual C++ 2010 和 Arduino UNO 之间通过 USB 进行串行通信

Linux 上的串行通信连接

串行通信 C++ ReadFile()

MODBUS-RTU串行链路通信协议及测试方法

串行通信

将整数转换为字符缓冲区以进行串行通信......? [关闭]