§ 2.9. Программирование модуля Ke-USB24A на языке Delphi (Часть 4)
|
Дмитрий Иванов, 30 мая 2008
|
|
Файлы к статье скачать
|
Имя: KA002_09.zip (ZIP архив) |
Размер: 216 КБ |
|
Продолжая цикл статей по программированию модуля Ke-USB24A на языке Delphi рассмотрим вариант программы-вольтметра, использующего АЦП модуля Ke-USB24A. Интерфейс программы незамысловат и может выглядеть вот так:
|

Как обычно, исходный проект программы можно скачать в файлах к статье. Рассмотрим ключевые моменты в программе. При нажатии кнопки "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