Я написал программу, вот код
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls,Ariphm,DateUtils;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
ComboBox1: TComboBox;
StaticText1: TStaticText;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ComboBox1Select(Sender: TObject);
procedure Button1Click(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..8] of byte;
st,stcom:string;
ttime,told:TDateTime;
implementation
{$R *.dfm}
procedure IniCOM;
var i:integer;
begin
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=2400 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;
SetCommTimeouts(hCom,comtime);
ab[1]:=ord('A');
ab[2]:=ord('T');
ab[3]:=13;
ab[4]:=10;
WriteFile(hCOM,ab,4,xn,nil);
if ReadFile (hCOM,ab,10,xn,nil) then
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.Label2.Caption:='COM?';
exit;
end;
end;
Form1.Label2.Caption:=stcom+' 2400';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
stcom:='COM1';
IniCOM;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(hCOM);
end;
procedure TForm1.ComboBox1Select(Sender: TObject);
begin
CloseHandle(hCOM);
stcom:=ComboBox1.Text;
IniCOM;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
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,8,xn,nil) then
begin
ttime:=Time;
if SecondsBetween(told,ttime)>0 then
begin
Application.MessageBox('Устройство не обнаружено','Error',MB_OK);
exit;
end;
if xn<>8 then
begin
Application.MessageBox('Неправильный формат данных','Error',MB_OK);
exit;
end;
for i:=0 to 7 do
StaticText1.Caption:=hexb(ab[i])+'';
end else
begin
Application.MessageBox('COM сломался','Error',MB_OK);
exit;
end;
end;
end.
Она принимает информацию от микроконтроллера, правда только один байт, вместо задуманных мной 8, может ли быть такое из-за того, что микроконтроллер посылает информацию с некоторой задержкой?
И подскажите пожалуйста, если нетрудно, как реализовать так, чтобы программа без кнопки запуска просто принимала информацию от микроконтроллера беспрерывно, т.е. все что он шлет, чтобы отображалось в поле statictext? Если кто знаком с программой СОМ2000, то мне вот нужно, чтобы на подобии как там было, подключаешь микроконтроллер и выдается вся передаваемая информация.
|