Титов Олег
Шрифт:
Приостановить прием/передачу данных может и возникновение любой ошибки при установленом в TRUE поле fAbortOnError в структуре DCB использованой для настройки режимов работы коммуникационного порта. В этом случае, для восстановления нормальной работы порта, следует использовать функцию:
Эта функция не только сбрасывает признак ошибки для соответсвующего порта, но и возвращает более подробную информацию об ошибке. Кроме того, возможно получение информации о текущем состоянии порта. Вот что означают параметры:
hFile
Описатель открытого файла коммуникационного порта.
lpErrors
Адрес переменной, в которую заносится информация об ошибке. В этой переменной могут быть установлены один или несколько из следующих бит:
CE_BREAK | Обнаружено состояние разрыва связи |
CE_DNS Только для Windows95. | Параллельное устройство не выбрано. |
CE_FRAME | Ошибка обрамления. |
CE_IOE | Ошибка ввода-вывода при работе с портом |
CE_MODE | Запрошеный режим не поддерживается, или неверный описатель hFile. Если данный бит установлен, то значение остальных бит не имеет значение |
CE_OOP | Только для Windows95. Для параллельного порта установлен сигнал "нет бумаги". |
CE_OVERRUN | Ошибка перебега (переполнение аппаратного буфера), следующий символ потерян |
CE_PTO | Только для Windows95. Тайм-аут на параллельном порту |
CE_RXOVER | Переполнение приемного буфера или принят символ после символа конца файла (EOF) |
CE_RXPARITY | Ошибка четности |
CE_TXFULL | Переполнение буфера передачи |
lpStat
Адрес структуры COMMSTAT. Должен быть указан, или адрес выделенного блока памяти, или NULL, если не требуется получать информацию о состоянии.
Если с информацией об ошибке все ясно, то со структурой COMMSTAT мы еще не встречались. Вот она:
Поля структуры имеют следующее значение:
fCtsHold
Передача приостановлена из-за сброса сигнала CSR.
fDsrHold
Передача приостановлена из-за сброса сигнала DSR.
fRlsdHold
Передача приостановлена из-за ожидания сигнала RLSD (receive-line-signal-detect). Более известное название данного сигнала – DCD (обнаружение несущей).
fXoffHold
Передача приостановлена из-за приема символа XOFF.
fXoffSent
Передача приостановлена из-за передачи символа XOFF. Следующий передаваемый символ обязательно должен быть XON, поэтому передача собственно данных тоже приостанавливается
fEof
Принят символ конца файла (EOF).
fTxim
В очередь, с помощью TransmitCommChar, поставлен символ для экстреной передачи.
fReserved
Зарезервировано и не используется.
cbInQue
Число символов в приемном буфере. Эти символы приняты из линии но еще не считаны функцией ReadFile.
cbOutQue
Число символов в передающем буфере. Эти символы ожидают передачи в линию. Для синхронных операций всегда 0.
Теперь Вы знаете почти все о работе с последовательными и параллельными портами в синхронном режиме. Особенности непосредственной работы с модемами я не буду рассматривать, так как существует большой набор высокоуровневых функций и протоколов, таких как TAPI, специально предназначеных для работы с модемами. Если Вас все же интересует эта тема, то почитайте описания функции GetCommModemStatus, и структур MODEMDEVCAPS и MODEMSETTINGS. В остальном работа с модемом ничем не отличается от работы с обычным портом.
Синхронный режим обмена довольно редко оказывается подходящим для серьезной работы с внешними устройствами через последовательные порты. Вместо полезной работы Ваша программа будет ждать завершения ввода/вывода, ведь порты работают значительно медленнее процессора. Да и гораздо лучше отдать время процессора другой программе, чем крутиться в цикле ожидая какого-либо события. Другими словами, пришло время знакомиться с асинхронной работой с портами.
Начнем с событий связаных с последовательными портами. Вы указываете системе осуществлять слежение за возникновением связанных с портом событий устанавливая маску с помощью функции
Маска отслеживаемых событий задается вторым параметром. Можно указывать любую комбинацию следующих значений:
EV_BREAK | Состояние разрыва приемной линии |
EV_CTS | Изменение состояния линии CTS |
EV_DSR | Изменение состояния линии DSR |
EV_ERR | Ошибка обрамления, перебега или четности |
EV_RING | Входящий звонок на модем (сигнал на линии RI порта) |
EV_RLSD | Изменение состояния линии RLSD (DCD) |
EV_RXCHAR | Символ принят и помещен в приемный буфер |
EV_RXFLAG | Принят символ заданый полем EvtChar структуры DCB использованой для настройки режимов работы порта |
EV_TXEMPTY | Из буфера передачи передан последний символ |