Код примера ниже открывает последовательный порт для асинхронной операции ввода-вывода, создает маску события, чтобы осуществлять текущий контроль за сигналами готовности к приему (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)
{
// Выполняем.
}
}
}
|