如何检查输入缓冲区是否为空

How can I check whether the input buffer is empty?

本文关键字:缓冲区 是否 输入 何检查 检查      更新时间:2023-10-16

我正在尝试编写一个简单的类,用于使用标准窗口库在Windows上操作串行端口。

我需要检查输入缓冲区是否为空。

到目前为止,我已经尝试使用SetCommEvent,使用EV_RXCHAR选项,但是此方法不起作用。该函数似乎在等待新字符的到来。如果我尝试发送 char,睡眠一秒钟并应用它,该函数将不会返回 - 它一直在等待。

bool isEmpty()
{
    DWORD dwEventMask = 0;
    DWORD Status = 0;
    if (CheckAsyncRead())
        return false;
    if (!SetCommMask(hPort, EV_RXCHAR)) //wait for char receival
        std::cout << "Error in creating Overlapped event" << std::endl;
    osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (WaitCommEvent(hPort, &dwEventMask, &osReader))
    {
                //close event handle
        return false;
    }
    Status = WaitForSingleObject(osReader.hEvent, 10);
        //I wait for 10 ms in case the function doesn't return immediately
    //Close event handle
    if (Status == WAIT_OBJECT_0)
    {
        return false;
    }
    else
        return true;
}

我希望 WaitCommEvent 或 WaitForSingleObject 会在缓冲区中存在任何字符的情况下返回,但如果在接收字符和调用 Wait 函数之间有更长的暂停,则不会发生这种情况。

您可以使用 ClearCommError 函数找出缓冲区中存储的数据的大小。

作为调用的结果,要通知的 COMSTAT 结构的 cbInQue 具有存储在输入缓冲区中的数据的大小。

您可以将 ReadFile(( 与使用 CreateFile(( 打开的句柄一起使用,其中包含 FILE_FLAG_OVERLAPPED 标志。如果 ReadFile(( 函数没有要返回的内容,它将返回最后一个错误ERROR_IO_PENDING这意味着您的缓冲区当前为空。