【发布时间】:2016-07-10 00:41:03
【问题描述】:
我是一名中级 C++ 程序员,但我不熟悉使用 Windows 的 API 函数。
我正在尝试创建一个控制台程序,它会一直坐/睡到任何一个
- 用户在控制台中输入内容并按下回车键
- 在已打开的串行端口上接收串行数据
四处搜索,听起来在 Windows 中执行此操作的方法是使用事件,(听起来它们与中断的基本概念相同?)
我找到了有关 WaitCommEvent 的文档,并且阅读了有关读取控制台输入缓冲区事件的信息。我猜要使用的函数是 WaitForMultipleObjects,但是我发送它的具体处理是什么,所以它会等待串行 RX 事件或控制台标准输入事件?
更新: 感谢您的回复!
目前我一直在使用 std::cin/cout 来读取和写入控制台。我查看了您提到的控制台 API 并看到了 GetStdHandle 函数,它将提供您提到的 CONIN$ 句柄。我可以将 CONIN$handle 发送到等待函数,而不是像您建议的那样使用 CreateFile 并手动使用 ReadFile/Console API 吗?
对于串行,我知道如何将串行句柄打开为 OVERLAPPED 而不是 NONOVERLAPPED,但我不确定您的意思
修改同步 I/O 代码以使用通常并不难 一个异步句柄
这样的?
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);
}
}
在读取完成之前,该标志将等待什么/在哪里?
【问题讨论】:
-
GetStdHandle 不一定会为您提供控制台句柄,如果您的程序是在标准输入(和/或标准输出和/或标准错误)重定向的情况下启动的。因此,如果您知道自己想要控制台,那么它不是最佳选择。对于重叠 I/O,您必须传递一个 OVERLAPPED 结构,包括一个事件句柄。