Интернет-журнал "Домашняя лаборатория", 2007 №8
Шрифт:
BOOL SetCommBreak(
HANDLE hFile
);
BOOL ClearCommBreak(
HANDLE hFile
);
Функция EscapeCommFunction
Следует заметить, что состояние разрыва линии устанавливается аппаратно. Поэтому нет другого способа возобновить прерванную, с помощью SetCommBreak, передачу данных, кроме вызова ClearCommBreak. Более тонкое управление потоком данным позволяет осуществить функция:
BOOL EscapeCommFunction(
HANDLE hFile,
DWORD dwFunc
);
Выполняемое
• CLRDTR — Сбрасывает сигнал DTR
• CLRRTS — Сбрасывает сигнал RTS
• SETDTR — Устанавливает сигнал DTR
• SETRTS — Устанавливает сигнал RTS
• SETXOFF — Симулирует прием символа XOFF
• SETXON — Симулирует прием символа XON
• SETBREAK — Переводит выходную линию передатчика в состояние разрыва. SetCommBreak является упрощенной формой данного вызова.
• CLRBREAK — Снимает состояние разрыва для выходной линии передатчика. ClearCommBreak является упрощенной формой данного вызова.
Функция ClearCommError
Приостановить прием/передачу данных может и возникновение любой ошибки при установленном в TRUE поле fAbortOnError в структуре DCB использованной для настройки режимов работы коммуникационного порта. В этом случае, для восстановления нормальной работы порта, следует использовать функцию:
BOOL ClearCommError(
HANDLE hFile,
LPDWORD IpErrors,
LPCOMSTAT IpStat
);
Эта функция не только сбрасывает признак ошибки для соответствующего порта, но и возвращает более подробную информацию об ошибке. Кроме того, возможно получение информации о текущем состоянии порта. Вот что означают параметры:
• 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
Если с информацией об ошибке все ясно, то со структурой 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. В остальном работа с модемом ничем не отличается от работы с обычным портом.