Выбрать главу

∙ 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

Если с информацией об ошибке все ясно, то со структурой 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. В остальном работа с модемом ничем не отличается от работы с обычным портом.

Синхронный режим обмена довольно редко оказывается подходящим для серьезной работы с внешними устройствами через последовательные порты. Вместо полезной работы Ваша программа будет ждать завершения ввода/вывода, ведь порты работают значительно медленнее процессора. Да и гораздо лучше отдать время процессора другой программе, чем крутиться в цикле, ожидая какого-либо события. Другими словами, пришло время знакомиться с асинхронной работой с портами.

Функция SetCommMask

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

BOOL SetCommMask(

    HANDLE hFile,

    DWORD dwEvtMask

);

Маска отслеживаемых событий задается вторым параметром. Можно указывать любую комбинацию следующих значений:

• EV_BREAK — Состояние разрыва приемной линии

• EV_CTS — Изменение состояния линии CTS

• EV_DSR — Изменение состояния линии DSR