Текущий контроль за коммуникационными событиями

Код примера ниже открывает последовательный порт для асинхронной операции ввода-вывода, создает маску события, чтобы осуществлять текущий контроль за сигналами готовности к приему (CTS) и сигналами готовности модема (DSR), а затем ожидает, какое событие произойдет. Функция WaitCommEvent должна исполниться как асинхронная операция, так что остальные потоки процесса не могут осуществлять операции ввода-вывода (I/O) в ходе времени ожидания.

#include <windows.h>
#include <assert.h>

void main( )
{
    HANDLE hCom;
    OVERLAPPED o;
    BOOL fSuccess;
    DWORD dwEvtMask;

    hCom = CreateFile( "COM1",
        GENERIC_READ | GENERIC_WRITE,
        0,    // монопольный доступ 
        NULL, // атрибуты безопасности по умолчанию 
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED,
        NULL 
        );

    if (hCom == INVALID_HANDLE_VALUE) 
    {
        // Обработка ошибки. 
        return;
    }

    // Установка маски события. 

    fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);

    if (!fSuccess) 
    {
        // Обработка ошибки. 
        return;
    }

    // Создаем объект события для использования
    // функцией WaitCommEvent. 

    o.hEvent = CreateEvent(
        NULL,   // атрибуты безопасности по умолчанию 
        FALSE,  // автосброс события 
        FALSE,  // состояние не сигнальное 
        NULL    // без имени
		);
    

    // Инициализация остатка структуры OVERLAPPED нулями.
    o.Internal = 0;
    o.InternalHigh = 0;
    o.Offset = 0;
    o.OffsetHigh = 0;

    assert(o.hEvent);

    if (WaitCommEvent(hCom, &dwEvtMask, &o)) 
    {
        if (dwEvtMask & EV_DSR) 
        {
             // Выполняем.
        }

        if (dwEvtMask & EV_CTS) 
        {
            // Выполняем. 
        }
    }
}

 

Назад в оглавление
На главную страницу

Hosted by uCoz