Читать «Работа с 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, поэтому передача собственно данных тоже приостанавливается