Попутно отметим, что в реестре по ключу НKEYLOCAL MACHINE\ HARD-WARE\ DEVICEMAP\ PARALLEL PORTS аналогичным образом хранятся имена параллельных портов.

В обработчике FormClose события формы OnCreate проверяется по значению переменной port, был ли открыт в приложении какой-либо порт. Если был, то он закрывается функцией CloseHandle.

Процедура ButtonlClick является обработчиком щелчка на кнопке Чтение параметров. Если в данный момент нет открытого порта (port = 0), то функцией CreateFile открывается порт с именем, выбранным в списке ComboBoxl. Далее функцией GetCommState запись lpDCB заполняется параметрами порта. При этом проверяется возвращаемое этой функцией значение. Если возвращено false, пользователю выдается сообщение о невозможности открыть порт.

При успешном выполнении функции GetCommState в выпадающих списках выделяются строки, соответствующие параметрам порта. При этом используется оговоренное ранее условие, что индексы строк в списках соответствуют численным значениям соответствующих полей. Только в списке CBByteSize индексы на 4 меньше, чем значения поля ByteSize, что и учитывается в приведенном коде.

После занесения в списки всех значений кнопка Установка параметров делается доступной. После этого пользователь может изменить значения параметров в списках и установить новые настройки порта.

Процедура Button2Click является обработчиком щелчка на кнопке Установка параметров. В ней значения параметров, заданные пользователем в выпадающих списках, переносятся в поля записи lpDCB. Затем вызывается функция SetCom-mState, заносящая новые настройки в порт. Если вызов функции завершился ошибкой, пользователю выдается соответствующее сообщение и вызывается описанная ранее функция ButtonlClick, чтобы восстановить в выпадающих списках прежние значения параметров.

Процедура ComboBoxlChange является обработчиком события OnChange списка ComboBoxl, в котором сдержится имя порта. Операторы этой процедуры очищают данные в списках, поскольку они относятся к прежнему порту, закрывают прежний порт и делают недоступной кнопку Button2.

Мы рассмотрели настройку основных параметров порта. Но работа порта характеризуется еще рядом параметров, определяющих максимальное время, отводимое на операции чтения и записи. Эти параметры определяют тайм-аут (timeout) - интервал времени, в течение которого функции записи и чтения ожидают появления новой информации. Если это время истекает, чтение или запись прерываются.

Получить информацию о временных параметрах порта можно функцией Get CommTimeouts:

function GetCommTimeouts(hFile: THandle;
var lpCommTimeouts: TCommTimeouts): BOOL;

Параметр hFile является дескриптором порта, a lpCommTimeouts - запись типа TCommTimeouts, содержащая следующие поля:

Поле

Описание

ReadlntervalTimeout: DWORD

Максимальное время, допустимое между двумя последовательными символами, считываемыми с коммуникационной линии.

ReadTotalTimeoutMultiplier: DWORD

Множитель, используемый для вычисления общего тайм-аута операции чтения.

ReadTotalTimeoutConstant: DWORD

Константа, используемая для вычисления общего тайм-аута операции чтения.

WriteTotalTimeoutMultiplier: DWORD

Множитель, используемый для вычисления общего тайм-аута операции записи.

WriteTotalTimeoutConstant: DWORD

Константа, используемая для вычисления общего тайм-аута операции записи.

Значения всех полей указываются в миллисекундах. Поле ReadInteгvalTi-теои! определяет максимальный интервал между двумя последовательными символами, точнее, межу началами передачи двух символов, включая время передачи самого символа. Если интервал между символами превысит заданное значение, операция чтения завершится и все данные, накопленные в буфере, передадутся в программу. Нулевое значение данного поля означает, что данный тайм-аут не используется. Если же в этом поле задать значение, соответствующее MAXDWORD (4294967295) и одновременно задать нулевые значения полей ReadTotalTimeoutConstant и ReadTo-1аГПтеои1МиШрНег, то операция чтения немедленно завершится и вернет уже принятый символ, даже если ни одного символа не было получено из линии.


⇐ Предыдущая страница| |Следующая страница ⇒

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Сентябрь
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс