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

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

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



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

Дмитрий Иванов, 30 мая 2008

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

Продолжая цикл статей по программированию модуля Ke-USB24A на языке Delphi рассмотрим вариант программы-вольтметра, использующего АЦП модуля Ke-USB24A. Интерфейс программы незамысловат и может выглядеть вот так:


Модуль АЦП Ke-USB24A Delphi

Как обычно, исходный проект программы можно скачать в файлах к статье. Рассмотрим ключевые моменты в программе. При нажатии кнопки "Open", помимо открытия виртуального COM порта мы запускаем таймер, который будет срабатывать примерно раз в секунду. Также подается команда на запрос переодической выдачи результатов работы АЦП с частото 1 Гц.

При срабатывании таймера управление передается функции FNTimeCallBack(). В ней мы читаем порцию данных из модуля, ищем в них сообщение с информацией о АЦП - #ADC. При нахождении преобразуем цифровой код АЦП в значение входного напряжения и отображаем результат в окошке ввода диалогового окна.

var
  Form1: TForm1;
  MyTimer: TTimer;
  uTimerID: word;
  i: word;
  CommHandle : hFile;
  DCB : TDCB;
  PortString: string;
  CommTimeOuts: TCOMMTIMEOUTS;

  p: PChar;
  BinBuf: array[0..1023] of Char;
  buffer: string;
  ADC_Res: array[0..64] of Char;
  ADCFloat: Double;
  CRbyte: Shortint;
  LFbyte: Shortint;
  NumberWritten : DWORD; 

implementation

{$R *.dfm}


procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD);stdcall;
begin

ReadFile(CommHandle, BinBuf, 128, NumberWritten, nil);
if(NumberWritten > 0) then
begin
p := BinBuf;
for i:=1 to NumberWritten do
begin
//**************
if (p^ = '#') then
begin
  if(StrLComp(p, PChar('#ADC,'), 4) = 0) then
  begin 
    p := p + 5;
    StrLCopy(ADC_Res, p, 4);
    ADCFloat := (StrToInt(ADC_Res)/1024)*5;
    Form1.Edit2.Text := FloatToStr(ADCFloat);
  end;
  inc(p);
end
//****************
end;
end;  
end; 


procedure TForm1.Button1Click(Sender: TObject);
begin
PortString := '\\.\COM' + Edit1.Text;   
CommHandle := CreateFile(PChar(PortString), GENERIC_READ or 
			GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);

if (CommHandle = INVALID_HANDLE_VALUE) then
begin
  MessageDlg('Error. Can`t Open port', mtError, [mbOK], 0);
end
else
begin
  GetCommState(CommHandle, DCB);
  DCB.BaudRate  := CBR_9600; 
  DCB.Parity    := NOPARITY;
  DCB.ByteSize  := 8;
  DCB.StopBits  := OneStopBit;
  
  CommTimeOuts.ReadIntervalTimeout          := 0;
  CommTimeOuts.ReadTotalTimeoutMultiplier   := 0;
  CommTimeOuts.ReadTotalTimeoutConstant     := 1000;
  CommTimeOuts.WriteTotalTimeoutMultiplier  := 0;
  CommTimeOuts.WriteTotalTimeoutConstant    := 1000;
  SetCommTimeouts(CommHandle, CommTimeOuts);
  SetCommState(CommHandle, DCB);

  uTimerID := timeSetEvent(1000,0,@FNTimeCallBack,100,TIME_PERIODIC);

  CRbyte := 13; // HEX 0x0D
  LFbyte := 10; // HEX 0x0A
  buffer := '$KE,ADC,1' + Char(CRbyte) + Char(LFbyte);
  WriteFile(CommHandle, PChar(buffer)^, Length(buffer), NumberWritten, nil);

  MessageDlg('Port Open Ok', mtInformation, [mbOK], 0);
end

end;



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



© KERNELCHIP 2006 - 2017