Читать «Работа с COM и LPT в Win32.» онлайн - страница 19

Олег Титов

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

CLRDTR

Сбрасывает сигнал DTR

CLRRTS

Сбрасывает сигнал RTS

SETDTR

Устанавливет сигнал DTR

SETRTS

Устанавливает сигнал RTS

SETXOFF

Симулирует прием символа XOFF

SETXON

Симулирует прием символа XON

SETBREAK

Переводит выходную линию передатчика в состояние разрыва. SetCommBreak является упрощенной формой данного вызова.

CLRBREAK

Снимает состояние разрыва для выходной линии передатчика. ClearCommBreak является упрощенной формой данного вызова.

Приостановить прием/передачу данных может и возникновение любой ошибки при установленом в TRUE поле fAbortOnError в структуре DCB использованой для настройки режимов работы коммуникационного порта. В этом случае, для восстановления нормальной работы порта, следует использовать функцию:

BOOL ClearCommError(HANDLE hFile, LPDWORD lpErrors, LPCOMSTAT lpStat);

Эта функция не только сбрасывает признак ошибки для соответсвующего порта, но и возвращает более подробную информацию об ошибке. Кроме того, возможно получение информации о текущем состоянии порта. Вот что означают параметры:

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 мы еще не встречались. Вот она:

typedef struct _COMSTAT

 DWORD fCtsHold:1;

 DWORD fDsrHold:1;

 DWORD fRlsdHold:1;

 DWORD fXoffHold:1;

 DWORD fXoffSent:1;

 DWORD fEof:1;

 DWORD fTxim:1;

 DWORD fReserved:25;

 DWORD cbInQue;

 DWORD cbOutQue;

} COMSTAT, *LPCOMSTAT;

Поля структуры имеют следующее значение:

fCtsHold

Передача приостановлена из-за сброса сигнала CSR.

fDsrHold

Передача приостановлена из-за сброса сигнала DSR.

fRlsdHold

Передача приостановлена из-за ожидания сигнала RLSD (receive-line-signal-detect). Более известное название данного сигнала – DCD (обнаружение несущей).

fXoffHold

Передача приостановлена из-за приема символа XOFF.

fXoffSent

Передача приостановлена из-за передачи символа XOFF. Следующий передаваемый символ обязательно должен быть XON, поэтому передача собственно данных тоже приостанавливается