Hej
Du skal have fat i en manual, der beskriver kommunikations protokollen til den Analoge radar. Med protokol mener jeg hvordan data'en er organiseret der sendes op til PC'en. Data afsendes typisk i en frame.
F.eks.: | Adresse | Længde |Data 1 | Data 2 |....|Data n | Checksum |, framen kan sagtens være helt anderledes end vist her. Framen kan have en fast eller variabel længde. Ligeledes såfremt du kan give radaren ordrer, er disse også fastlagt i protokollen.
Det er vigtigt du ved hvornår framen starter og stopper, for at synkronisere modtagelsen af data. Jeg formoder det er ekkoer du modtager fra radaren? Hvis det er det, kunne man antage f.eks., at hvert ekko er beskrevet med et polært koordinat, dvs. en afstand og en vinkel. F.eks. kan afstanden være et 16bit tal og vinklen et 16bit tal, så vil et givent ekko ligge således i framen: ...| afstand HB | afstand LB | vinkel HB | vinkel LB |... . Dvs. afstanden er opbygget af 2 bytes (highbyte + lowbyte), der tilsammen giver et Word. Har du de 2 bytes kan Word'et bestemmes på flg. måde:
// Den pæne måde at isolere et word på, ud fra low/high-byte.
// Metoden er velegnet også til f.eks. 32 bit tal.
procedure TForm1.Button1Click(Sender: TObject);
var
Resultat:Word;
Indtal:array[1..2] of Byte absolute Resultat;
begin
Indtal[1]:=10; // Lowbyte
Indtal[2]:=2; // Highbyte
Memo1.Lines.Add('Resultat:='+IntToStr(Resultat));
end;
// En alternativ måde.
procedure TForm1.Button2Click(Sender: TObject);
var
Resultat:Word;
Highbyte,Lowbyte:Byte;
begin
Lowbyte:=10;
Highbyte:=2;
Resultat:=256*Highbyte+Lowbyte;
Memo1.Lines.Add('Resultat:='+IntToStr(Resultat));
end;
Hvis der nu er en bestemt start streng og slut streng i framen, er det let at opsnappe framen/data-pakken. Så kan du som sagt bruge ComDataPacket komponentet's onPacket event handler. Desuden skal du også klippe bider ud af modtagede streng og derefter videre bearbejde dem.:
// Frame i dette eksempel:
// | 'P' | 'A' | 'K' | 'K' | 'E' | 'N' | Afstand HB | Afstand LB | Vinkel HB | Vinkel LB
//| 'S' | 'T' | 'O' | 'P' | 'H' | 'E' | 'R' |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, CPort, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
ComPort1: TComPort;
ComDataPacket1: TComDataPacket;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ComDataPacket1Packet(Sender: TObject; const Str: String);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
Afstand:Word;
Vinkel:Word;
public
{ Public declarations }
procedure Bearbejd_data(Modtaget:string);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Bearbejd_data(Modtaget:string);
var
Resultat:Word;
Indtal:Array[1..2] of Byte absolute Resultat;
begin
Indtal[2]:=Ord(Modtaget[1]);
Indtal[1]:=Ord(Modtaget[2]);
Afstand:=Resultat;
Indtal[2]:=Ord(Modtaget[3]);
Indtal[1]:=Ord(Modtaget[4]);
Vinkel:=Resultat;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// Disse 3 initialiseringer kan man også lave designtime i
// relevante properties.
ComDataPacket1.ComPort:=ComPort1;
ComDataPacket1.StartString:='PAKKEN'; // Start streng.
ComDataPacket1.StopString:='STOPHER'; // Stop streng.
ComPort1.Open;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ComPort1.Close;
end;
// Dette er OnPacket event handleren hvor data modtages på PC'en, fra
// den serielle port. Start og stop karakter er ikke med i Str.
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: String);
begin
Bearbejd_data(Str);
Memo1.Lines.Add('Afstand='+IntToStr(Afstand)+
' , Vinkel='+IntToStr(Vinkel));
end;
// Et eksempel på en radar ordrer, afsendt fra PC'en.
procedure TForm1.Button1Click(Sender: TObject);
begin
ComPort1.WriteStr('STARTRADAR');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ComPort1.WriteStr('STOPRADAR');
end;
end.
Det kan være de pakker/frames PC'en modtager er lidt kryptiske. F.eks. kun med en startbetingelse og et data felt, der beskriver længden af frame'en. Så skal programmet vente på start bestingelsen, aflæse længden i relevante data felt. Der skal anvendes en global tæller, der tælles op, hver gang der modtages en byte fra framen. Når så den globale tæller er talt op til, den aflæste længde, der blev fundet i længde data feltet, er pakken modtaget. Du bliver måske nødt til, at benytte OnRxChar event handleren på ComPort1 objektet i stedet for.
MVH
Wilhelm
Indlæg senest redigeret d. 20.03.2006 00:48 af Bruger #9671