Олег Титов - Работа с COM и LPT в Win32.
- Название:Работа с COM и LPT в Win32.
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Олег Титов - Работа с COM и LPT в Win32. краткое содержание
Работа с COM и LPT в Win32. - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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, поэтому передача собственно данных тоже приостанавливается
fEof
Принят символ конца файла (EOF).
fTxim
В очередь, с помощью TransmitCommChar, поставлен символ для экстреной передачи.
fReserved
Зарезервировано и не используется.
cbInQue
Число символов в приемном буфере. Эти символы приняты из линии но еще не считаны функцией ReadFile.
cbOutQue
Число символов в передающем буфере. Эти символы ожидают передачи в линию. Для синхронных операций всегда 0.
Теперь Вы знаете почти все о работе с последовательными и параллельными портами в синхронном режиме. Особенности непосредственной работы с модемами я не буду рассматривать, так как существует большой набор высокоуровневых функций и протоколов, таких как TAPI, специально предназначеных для работы с модемами. Если Вас все же интересует эта тема, то почитайте описания функции GetCommModemStatus, и структур MODEMDEVCAPS и MODEMSETTINGS. В остальном работа с модемом ничем не отличается от работы с обычным портом.
Синхронный режим обмена довольно редко оказывается подходящим для серьезной работы с внешними устройствами через последовательные порты. Вместо полезной работы Ваша программа будет ждать завершения ввода/вывода, ведь порты работают значительно медленнее процессора. Да и гораздо лучше отдать время процессора другой программе, чем крутиться в цикле ожидая какого-либо события. Другими словами, пришло время знакомиться с асинхронной работой с портами.
Начнем с событий связаных с последовательными портами. Вы указываете системе осуществлять слежение за возникновением связанных с портом событий устанавливая маску с помощью функции
BOOL SetCommMask(HANDLE hFile, DWORD dwEvtMask);
Маска отслеживаемых событий задается вторым параметром. Можно указывать любую комбинацию следующих значений:
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 | Из буфера передачи передан последний символ |
Если dwEvtMask равно нулю, то отслеживание событий запрещается. Разумеется всегда можно получить текущую маску отслеживаемых событий с помощью функции
BOOL GetCommMask(HANDLE hFile, LPDWORD lpEvtMask);
Вторым параметром задается адрес переменной принимающей значение текущей установленой маски отслеживаемых событий. В дополнение к событиям, перечисленым в описании функции SetCommMask, данная функция может возвратить следующие:
EV_EVENT1 | Устройство-зависимое событие |
EV_EVENT2 | Устройство-зависимое событие |
EV_PERR | Ошибка принтера |
EV_RX80FULL | Приемный буфер заполнен на 80 процентов |
Эти дополнительные события используются внутри драйвера. Вы не должны переустанавливать состояние их отслеживания.
Когда маска отслеживаемых событий задана, Вы можете приостановить выполнение своей программы до наступления события. При этом программа не будет занимать процессор. Это выполняется вызовом функции
BOOL WaitCommEvent(HANDLE hFile, LPDWORD lpEvtMask, LPOVERLAPPED lpOverlapped);
Замечу, что в переменной, адресуемой вторым параметром, не будут устанавливаться внутренние события драйвера (перечислены в описании функции GetCommMask). В единичное состояние установятся только те биты, которые соответствуют реально произошедшим событиям.
Читать дальшеИнтервал:
Закладка: