∙ hFile
Описатель открытого файла коммуникационного порта.
∙ IpErrors
Адрес переменной, в которую заносится информация об ошибке. В этой переменной могут быть установлены один или несколько из следующих бит:
• CE_BREAK — Обнаружено состояние разрыва связи
• CE_DNS — Только для Windows95. Параллельное устройство не выбрано.
• CE_FRAME — Ошибка обрамления.
• СЕ_IOЕ — Ошибка ввода-вывода при работе с портом
• СЕ_MODE — Запрошенный режим не поддерживается, или неверный описатель hFile. Если данный бит установлен, то значение остальных бит не имеет значение.
• СЕ_ООР — Только для Windows95. Для параллельного порта установлен сигнал "нет бумаги".
• CE_OVERRUN — Ошибка перебега (переполнение аппаратного буфера), следующий символ потерян.
• СЕ_РТО — Только для Windows95. Тайм-аут на параллельном порту.
• CE_RXOVER — Переполнение приемного буфера или принят символ после символа конца файла (EOF)
• CE_RXPARITY — Ошибка четности
• CE_TXFULL — Переполнение буфера передачи
∙ IpStat
Адрес структуры COMMSTAT. Должен быть указан, или адрес выделенного блока памяти, или NULL, если не требуется получать информацию о состоянии.
Если с информацией об ошибке все ясно, то со структурой COMMSTAT мы еще не встречались. Вот она:
typedef struct _COMSTAT
DWORD fCtsHold:1;
DWORD fDsrHoldr:1;
DWORD fRlsdHold:1;
DWORD fXoffHold:1;
DWORD fXoffSent:1;
DWORD fEof:1;
DWORD fTxim:1;
DWORD fReserved:25;
DWORD cblnQue;
DWORD cbOutQue;
} COMSTAT, *LPCOMSTAT;
Поля структуры имеют следующее значение:
∙ fCtsHold
Передача приостановлена из-за сброса сигнала CSR.
∙ fDsrHold
Передача приостановлена из-за сброса сигнала DSR.
∙ fRlsdHold
Передача приостановлена из-за ожидания сигнала RLSD (receive-line-signal-detect). Более известное название данного сигнала — DCD (обнаружение несущей).
∙ fXoffHold
Передача приостановлена из-за приема символа XOFF.
∙ fXoffSent
Передача приостановлена из-за передачи символа XOFF. Следующий передаваемый символ обязательно должен быть XON, поэтому передача собственно данных тоже приостанавливается
∙ fEof
Принят символ конца файла (EOF).
∙ fTxim
В очередь, с помощью TransmitCommChar, поставлен символ для экстренной передачи.
∙ fReserved
Зарезервировано и не используется.
∙ cblnQue
Число символов в приемном буфере. Эти символы приняты из линии но еще не считаны функцией ReadFile.
∙ cbOutQue
Число символов в передающем буфере. Эти символы ожидают передачи в линию. Для синхронных операций всегда 0.
Теперь Вы знаете почти все о работе с последовательными и параллельными портами в синхронном режиме. Особенности непосредственной работы с модемами я не буду рассматривать, так как существует большой набор высокоуровневых функций и протоколов, таких как TAPI, специально предназначенных для работы с модемами. Если Вас все же интересует эта тема, то почитайте описания функции GetCommModemStatus, и структур MODEMDEVCAPS и MODEMSETTINGS. В остальном работа с модемом ничем не отличается от работы с обычным портом.
Синхронный режим обмена довольно редко оказывается подходящим для серьезной работы с внешними устройствами через последовательные порты. Вместо полезной работы Ваша программа будет ждать завершения ввода/вывода, ведь порты работают значительно медленнее процессора. Да и гораздо лучше отдать время процессора другой программе, чем крутиться в цикле, ожидая какого-либо события. Другими словами, пришло время знакомиться с асинхронной работой с портами.
Начнем с событий связанных с последовательными портами. Вы указываете системе осуществлять слежение за возникновением связанных с портом событий, устанавливая маску с помощью функции
BOOL SetCommMask(
HANDLE hFile,
DWORD dwEvtMask
);
Маска отслеживаемых событий задается вторым параметром. Можно указывать любую комбинацию следующих значений:
• EV_BREAK — Состояние разрыва приемной линии
• EV_CTS — Изменение состояния линии CTS
• EV_DSR — Изменение состояния линии DSR