СОМ порт прием информации от микроконтроллера
Здравствуйте, помогите пожалуйста.
Есть программа, которая по СОМ порту принимает информацию от часов и в соответствующие statictext записывает число, месяц, год, час, минуту и секунду. Вот код этой программы
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Ariphm, ExtCtrls,DateUtils;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
StaticTextDate: TStaticText;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
StaticTextMonth: TStaticText;
StaticTextYear: TStaticText;
StaticTextHour: TStaticText;
StaticTextMin: TStaticText;
StaticTextSek: TStaticText;
Label7: TLabel;
ComboBox1: TComboBox;
Label8: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ComboBox1Select(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hCOM:hFile=0;
pDCB:TDCB;
comtime:TCOMMTIMEOUTS;
xb:byte;
xn:dword;
ab: array[1..6] of byte;
st,stcom:string;
ttime,told:TDateTime;
implementation
{$R *.dfm}
procedure IniCOM;
var i:integer;
begin
{инициализация COM - номер с строке stcom}
hCOM:=CreateFile(Pchar(stcom), GENERIC_READ+GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
if (hCom = INVALID_HANDLE_VALUE) then
begin
st:=stcom+' не найден';
Application.MessageBox(Pchar(st),'Error',MB_OK);
exit;
end;
if GetCommState(hCOM,pDCB)
then st:=stcom+': baud=9600 parity=N data=8 stop=1';
if BuildCommDCB(Pchar(st),pDCB) then SetCommState(hCOM,pDCB)
else
begin
st:=stcom+' занят или заданы неверные параметры';
Application.MessageBox(Pchar(st),'Error',MB_OK);
exit;
end;
GetCommTimeouts(hCom,comtime); {устанавливаем задержки:}
comtime.WriteTotalTimeoutMultiplier:=1;
comtime.WriteTotalTimeoutConstant:=10;
comtime.ReadIntervalTimeout:=10;
comtime.ReadTotalTimeoutMultiplier:=1;
comtime.ReadTotalTimeoutConstant:=2000; {ждем чтения 2 сек}
SetCommTimeouts(hCom,comtime);
ab[1]:=ord('A'); {будем посылать инициализацию модема}
ab[2]:=ord('T');
ab[3]:=13;{CR}
ab[4]:=10;{LF}
WriteFile(hCOM,ab,4,xn,nil);
if ReadFile(hCOM,ab,10,xn,nil) then {ответ модема 10 знаков}
begin
st:='';
for i:=1 to 10 do st:=st+chr(ab[i]);
if pos('OK',st)<>0 then
begin
st:=stcom+' занят модемом';
Application.MessageBox(Pchar(st),'Error',MB_OK);
CloseHandle(hCOM);
hCOM:=0;
Form1.Label7.Caption:='COM?';
exit;
end;
end;
Form1.Label7.Caption:=stcom+' 9600';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin {запрос}
if (hCOM=0) or (hCOM=INVALID_HANDLE_VALUE) then exit;
{если порт еще не инициализирован - выход}
PurgeComm(hCOM,PURGE_RXCLEAR); {очищаем буфер}
xb:=$A2;
WriteFile(hCOM,xb,1,xn,nil);
told:=Time;
if ReadFile(hCOM,ab,6,xn,nil) then {читаем 6 байт в массив ab}
begin
ttime:=Time;
if SecondsBetween(told,ttime)>0 then
begin
Application.MessageBox('Устройство не обнаружено','Error',MB_OK);
exit;
end;
if xn<>6 then
begin
Application.MessageBox('Неправильный формат данных','Error',MB_OK);
exit;
end;
StaticTextYear.Caption:=hexb(ab[6]);
StaticTextMonth.Caption:=hexb(ab[5]);
StaticTextDate.Caption:=hexb(ab[4]);
StaticTextHour.Caption:=hexb(ab[3]);
StaticTextMin.Caption:=hexb(ab[2]);
StaticTextSek.Caption:=hexb(ab[1]);
end else {не сработало}
begin
Application.MessageBox('СОМ сломался','Error',MB_OK);
exit;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{инициализация COM1 при запуске}
stcom:='COM1';
IniCOM;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin {уничтожаем COM}
CloseHandle(hCOM);
end;
procedure TForm1.ComboBox1Select(Sender: TObject);
begin
CloseHandle(hCOM); {закрываем старый СОМ}
stcom:=ComboBox1.Text; {устанавливаем порт COM1,2,3,4}
IniCOM;
end;
end.
Мне же необходимо написать программку, которая будет по СОМ порту принимать информацию от микроконтроллера, для начала хотя бы 8 байт.
В принципе мне кажется, что программа будет аналогичной, только мне не понадобится столько полей statictext, а можно обойтись одним. Я написал код, он идентичен предыдущему, только массив ab не от 1 до 6, а от 1 до 8 (так как принять надо 8 байт). У меня возникла проблема при программировании кнопки button1, как мне записать чтобы вся информация вывелась в statictext1?
Я пробовал написать
StaticText1.Caption:=hexb (ab[1..8]), но выдает ошибку.
В программе с часами там в каждое поле, если я правильно понял, выводится по одному байту, которые и несут в себе информацию о числе, месяце и т.д., а мне надо чтобы в одно поле вошла вся информация с микроконтроллера. Помогите пожалуйста разобраться.
|