Как я могу проверить, пуст ли буфер ввода? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь написать простой класс для работы с последовательным портом в Windows, используя стандартную библиотеку 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 будет более длительная пауза.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Вы можете использовать функцию ClearCommError , чтобы узнать размер данных, хранящихся в буфере.

В результате вызова cbInQue структуры COMSTAT для уведомления указывается размер данных, хранящихся во входном буфере.

0 голосов
/ 08 апреля 2019

Вы можете использовать ReadFile () с дескриптором, открытым с помощью CreateFile () с флагом FILE_FLAG_OVERLAPPED. Если функции ReadFile () нечего возвращать, она вернет последнюю ошибку ERROR_IO_PENDING, которая означает, что ваш буфер в настоящее время пуст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...