Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 2.7. Программирование модуля Ke-USB24A на языке Delphi (Часть 2)

Дмитрий Иванов, 13 апреля 2008

Файлы к статье скачать
Имя: KA002_07.zip (ZIP архив)
Размер: 218 КБ

Продолжаем разговор о модуле Ke-USB24A. Уважаемые Delphi-программисты, это статья для Вас. Здесь мы напишем программу полностью аналогичную той, которая рассмотрена в статье этого раздела где работы велись на языке С++. Если быть более точным - будем считывать информацию с линий модуля настроенных на вход.


Итак, проект программы Вы как обычно можете скачть в файлах к этой статье. Внешне окно программы выглядит вот так:

программирование USB на Delphi

Обратим наши взгляды к коду. Обработчик нажатия кнопки "Open" мы пожалуй рассматривать не будем, т.к. это уже было сделано в одной из предыдущих статей. Гораздо интереснее посмотреть на код обработчка кнопки Read. Что мы тут делаем: проверяем введенные данные на "вшивость", формируем команду чтения линии и отправляем ее в порт. Затем делаем небольшую задержку, чтобы модуль успел отработать запрос. Читаем данные из порта. Если там данные есть, начинаем их "разбирать по полочкам". Сначала проверяем на наличиие ответа о линии настроенной на выход - #RD,WRONGLINE. Если в ответе такого нет, идем дальше и вытаскиваем значение входной линии, заодно проверяя ответ на корректность. В конце выводим полученную информацию в виде сообщения. Предложенный вариант чтения разумеется не является единственным. Более гибким решением будет использование отдельного потока, "слушающего" порт и отыскивающего ответы модуля, например, по получению символа #.

procedure TForm1.Button2Click(Sender: TObject);
var
Line: Byte;
Value: Byte;
BinBuf: array[0..1023] of Char;
Buf: string;
CRbyte: Shortint;
LFbyte: Shortint;
NumberWritten : DWORD;
begin
CRbyte := 13; // HEX 0x0D
LFbyte := 10; // HEX 0x0A

Line := StrToInt(Edit2.Text);
if ((Line < 0) or (Line > 24)) then
begin
  MessageDlg('Invalid Line Number', mtError, [mbOK], 0);
  Exit;
end;

//**********************************************************

Buf := '$KE,RD,' + Edit2.Text + Char(CRbyte) + Char(LFbyte);
WriteFile(CommHandle, PChar(Buf)^, Length(Buf), NumberWritten, nil);

// Make littele pause for wait module anser
Sleep(20); // Wait 20 ms

ReadFile(CommHandle, BinBuf, 128, NumberWritten, nil);
if(NumberWritten = 0) then
begin
  MessageDlg('Reaf Line Fail #1', mtError, [mbOK], 0);
  Exit;
end;

// We have read some data from port. Let`s try to parse it
if(StrLComp(BinBuf, '#RD,WRONGLINE', 13) = 0) then
begin
  MessageDlg('This line setup as OUTPUT. Can`t read data.', mtError, [mbOK], 0);
  Exit;
end;

// We must get anser like this: #RD,,
Buf := Format('#RD,%.2d,', [Line]);
if(StrLComp(BinBuf, PChar(Buf), Length(Buf)) = 0) then
begin
  Value := Byte(BinBuf[Length(Buf)]) - $30;
  if((Value < 0) or (Value > 1) ) then
  begin
    MessageDlg('Reaf Line Fail #3', mtError, [mbOK], 0);
    Exit;
  end;
  Buf := Format('Line: %d Value: %d', [Line, Value]);
  MessageDlg(Buf, mtInformation, [mbOK], 0);
  Exit;
end
else
begin
  MessageDlg('Reaf Line Fail #2', mtError, [mbOK], 0);
  Exit;
end;

//*************************************************************

end;
end.


© Дмитрий Иванов
13 апреля 2008 года
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2017