ShowMessage('He удалось открыть порт COM1');
exit ;
end;

// настройка параметров в записи lpDCB

// запись параметров в порт if not SetCommState(port, lpDCB) then

ShowMessage('Значения параметров недопустимые' + #13'Установка не произведена');
end;
procedure TForml.Button2Click(Sender: TObject);
// процедура записи var S: string;

n: DWORD; begin

S := 'Это передаваемый текст';

FlushFileBuffers(port); WriteFile(port, S, Length(S), n, @Overlapp); if GetLastError ERROR_IO_PENDING

then ShowMessage('Ошибка') else Timerl.Enabled := true;
end;

procedure TForml.Button3Click(Sender : TObject); // процедура чтения var n: DWORD; begin buf : =

FlushFileBuffers(port);

ReadFile (port, buf, 128, n, @Overlapp); if GetLastError ERROR_IO_PENDING

then ShowMessage('Ошибка *)

else Timerl.Enabled := truer-end;
procedure TForml.TimerITimer(Sender : TObject);
var n: integer;

begin

if GetOverlappedResult(port, Overlapp, DWORD(n), false) then begin

Labell.Caption := 'Получены/переданы новые данные - ' +

IntToStr(n) + ' байт'; Timerl.Enabled := false; end

else Labell.Caption := 'Новых данных нет';
end;

В этом примере пропущены некоторые детали настройки порта, которые были подробно рассмотрены в разд. 11.18.1. Среди объявленных глобальных переменных обратите внимание только на отсутствовавшую в предыдущих примерах переменную Overlapp - запись типа TOverlapped. В процедуре FormCreate все поля этой записи заполняются нулями.

Процедура ButtonlClick является обработчиком щелчка на кнопке, открывающей и настраивающей порт. Единственное отличие от ранее рассмотренных примеров - указание флага FILE_JFLAG_OVERLAPPED в вызове функции CreateFile.

Процедура Button2Click является обработчиком щелчка на кнопке, инициирующей запись. Сначала функцией FlushFileBuf fers очищается буфер порта. Затем вызывается функция WriteFile, в которую последним аргументом передается адрес записи Overlapp. Далее функцией GetLastError проверяется отсутствие ошибки. Если ошибки нет, то запускается таймер Timerl, который введен в приложение и осуществляет периодический запрос информации об операциях чтения и записи. Свойство Enabled таймера сначала установлено в false, так что таймер запускается только при успешном начале выполнении процедур асинхронного чтения и записи.

Процедура Button3Click является обработчиком щелчка на кнопке, инициирующей чтение. Она подобна рассмотренной процедуре Button2Click.

Процедура TimerlTimer является обработчиком события таймера OnTimer. В этой процедуре вызывается функция GetOverlappedResult. Если она возвращает true, то в метку Labell выводится сообщение об окончании операции чтения или записи и о числе переданных байтов. Затем таймер выключается. Если функция GetOverlappedResult возвращает false, то в метку Labell выводится сообщение об отсутствии новых данных.

Рассмотренный пример ориентирован на VCL Win32. В приложении VCL .NET иначе должны выглядеть процедуры записи (Button2Click) и чтения (Button3Click):

procedure TForml.Button2Click(Sender: TObject);
// процедура записи var S: string;

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

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



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

  • Июнь
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31