gpt4 book ai didi

c++ - 在 Windows API 中等待串行接收事件和控制台输入事件

转载 作者:搜寻专家 更新时间:2023-10-31 00:58:03 26 4
gpt4 key购买 nike

我是一名中级 C++ 程序员,但我不熟悉使用 Windows 的 API 函数。

我正在尝试创建一个控制台程序,它会一直坐着/睡到任一个

  1. 用户在控制台输入内容并按下回车键
  2. 在已经打开的串口上接收串口数据

四处搜索,听起来在 Windows 中执行此操作的方法是使用事件,(听起来它们与中断的基本思想相同?)

我找到了有关 WaitCommEvent 的文档,并且阅读了有关读取控制台输入缓冲区事件的内容。我猜要使用的函数是 WaitForMultipleObjects,但是我发送它的具体处理是什么,以便它等待串行 RX 事件或控制台标准输入事件?

更新:感谢您的回复!

目前我一直在使用 std::cin/cout 来读取和写入控制台。我查看了您提到的 Console API,并看到了 GetStdHandle 函数,它将提供您提到的 CONIN$ 句柄。我可以只将 CONIN$ 句柄发送到等待函数,而不是像您建议的那样使用 CreateFile 和手动使用 ReadFile/Console API 吗?

对于串行,我知道如何打开我的串行句柄作为 OVERLAPPED 而不是作为 NONOVERLAPPED,但我不确定你的意思

it is not usually too difficult to modify synchronous I/O code to use an asynchronous handle

是这样的吗?

uint32 read(HANDLE serialHandle, uint8* pBuffer, int32 bufferLenght)
{
DWORD dwBytesRead;

if (!ReadFile(SerialHandle, pBuffer, bufferLength, &dwBytesRead, NULL))
{ /*ERROR*/ }
else
{
// Wait on some flag or variable until read is complete
// to make this call synchronous/NONOVERLAPPED ?
return static_cast<uint32>(dwBytesRead);
}
}

在读取完成之前,该标志将等待什么/在哪里?

最佳答案

来自 Low-Level Console Input Functions在 MSDN 上:

A thread of an application's process can perform a wait operation to wait for input to be available in an input buffer. To initiate a wait operation, specify a handle to the input buffer in a call to any of the wait functions.

因此您需要使用控制台句柄,您可以通过在 CONIN$ 上调用 CreateFile 来获得它。您还需要使用相同的句柄(通过 ReadFile 或控制台 API)来读取控制台输入;由于缓冲,使用运行时库函数可能会使您陷入困境。

对于串口,我相信你会需要使用异步I/O。 WaitCommEvent 函数(当提供异步模式句柄时)接受包含手动重置事件对象句柄的 OVERLAPPED 结构。然后,您将在对 WaitForMultipleObjects 的调用中使用相同的事件句柄。

不幸的是,这是一个全有或全无的选择,因此您必须以异步模式打开 COM 句柄并独占使用异步 I/O。 (幸运的是,修改同步 I/O 代码以使用异步句柄通常不是太难,尽管如果有很多 I/O 调用,您可能希望编写一个包装函数来完成构建 OVERLAPPED 的重复工作结构并等待操作完成。)

关于c++ - 在 Windows API 中等待串行接收事件和控制台输入事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36166050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com