windows - 通过 IOCP 进行串行通信

标签 windows serial-port iocp

是否可以使用串行 I/O 的 IO 完成端口?根据 Windows via C/C++,它暗示这是可能的,并且确实给出了一个使用 IOCP 与物理文件的示例,显示了 CreateFile、ReadFile、WriteFile 等的工作。但是,这实际上可以与串行通信一起使用吗 - 有人知道吗?它工作吗?

我在网络上找不到任何这样的示例,但我不能是第一个尝试它的人?

最佳答案

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

设置基本上是:

  1. 使用 CreateFile() 打开串行端口传入FILE_FLAG_OVERLAPPED值为 dwFlagsAndAttributes参数。
  2. 使用 GetCommState() 根据需要修改串行端口状态和SetCommState() 。就像不使用 IOCP 时一样执行此操作。
  3. 使用GetCommTimeouts()SetCommTimeouts()关闭读取操作的总超时,因为异步操作的超时通常没有意义。 (您可以显式调用 CancelIO() 来取消读取操作。)通过设置 ReadTotalTimeoutMultiplier 来关闭总超时。和ReadTotalTimeoutConstant COMMTIMEOUTS 的字段结构归零。

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

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

关于windows - 通过 IOCP 进行串行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/673896/

相关文章:

windows - 在Windows上重新启动Electron应用程序

winapi - 是否可以在Reactor风格的操作中使用IOCP(或其他API)?

winsock - GetQueuedCompletionStatus 挂起

javascript - 针对不同 Node 版本编译的串口模块

terminal - 使用并行/串行端口重定向将数据从终端桌面传输到本地计算机

linux-kernel - 从 linux 内核模块访问串行端口

c++ - 如何同时等待 I/O 完成端口和事件?

c# - 将 winapi 事件转发到另一个窗口

windows - Windows 7 上的 Perl 5.16 无法安装模板工具包

c++ - 如何优化大型内存数据库的分页