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