![]() |
|||
| HSG |
|
Wir wollen zum Senden die Leitung RTS und zum Empfangen die Leitung CTS benutzen. Die Ansteuerung
der seriellen Schnittstelle wollen wir einem Objekt NetzHW (Netz-Hardware) überlassen.
Das Objekt verbirgt technische Details.
Die Ausgabe-Leitung heißt aus und die Eingabe-Leitung ein. Außer den Methoden zum
Setzen bzw. Auslesen der Leitungen hat die Klasse die Methoden Start zum Starten der
Hardware und Stop zum Stoppen. Start kann über einen Parameter noch die Nummer der
Schnittstelle auswählen.
UNIT mTNetzHW;
interface
//-------------------- ggf Uses-Liste anpassen ! --------------------
uses Windows, SysUtils, Dialogs;
type
TNetzHW = CLASS
// weitere Attribute
private
PortHandle : integer;
// weitere Methoden
public
procedure SetAus (pAus: boolean); virtual;
procedure Start (nr: byte); virtual;
procedure Stop; virtual;
function GetEin : boolean; virtual;
end;
implementation
//+---------------------------------------------------------------------
//| TNetzHW: Methodendefinition
//+---------------------------------------------------------------------
//-------- SetAus (public) ---------------------------------------------
procedure TNetzHW.SetAus (pAus: boolean);
begin
if pAus
then
EscapeCommFunction(PortHandle,SETRTS)
else
EscapeCommFunction(PortHandle,CLRRTS);
end;
//-------- Start (public) ----------------------------------------------
procedure TNetzHW.Start (nr: byte);
var
res,error : integer;
PortStr : string;
begin
PortStr := 'COM'+IntToStr(nr);
res := CreateFile(PChar(PortStr),
GENERIC_READ or GENERIC_WRITE,
0,nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if res > 0
then
begin
PortHandle := res;
setAus(false); // RTS auf Null
EscapeCommFunction(PortHandle,CLRDTR); // DTR auf Null
end
else
begin
error := GetLastError;
ShowMessage('Fehler: '+IntToStr(error));
end;
end;
//-------- Stop (public) -----------------------------------------------
procedure TNetzHW.Stop;
begin
CloseHandle(PortHandle);
end;
//-------- GetEin (public) ---------------------------------------------
function TNetzHW.GetEin : boolean;
var
ein : DWORD;
begin
GetCommModemStatus(PortHandle,ein);
result := (ein and 16) > 0; // Ausmaskieren des CTS-Bits
end;
end.
procedure TForm1.bMessungenClick(Sender: TObject);
var
c,n1,n2 : TLargeInteger;
t : real;
ein : boolean;
begin
QueryPerformanceFrequency(c);
mAus.Lines.Add('c = '+IntToStr(c));
QueryPerformanceCounter(n1);
NetzHW.Start(2);
QueryPerformanceCounter(n2);
t := (n2-n1)/c;
mAus.Lines.Add('Start(2) : '+FloatToStr(t)+'s');
QueryPerformanceCounter(n1);
NetzHW.SetAus(true);
QueryPerformanceCounter(n2);
t := (n2-n1)/c;
mAus.Lines.Add('SetAus(true) : '+FloatToStr(t)+'s');
QueryPerformanceCounter(n1);
ein := NetzHW.GetEin;
QueryPerformanceCounter(n2);
t := (n2-n1)/c;
mAus.Lines.Add('ein := GetEin : '+FloatToStr(t)+'s');
QueryPerformanceCounter(n1);
NetzHW.Stop;
QueryPerformanceCounter(n2);
t := (n2-n1)/c;
mAus.Lines.Add('Stop : '+FloatToStr(t)+'s');
end;
Andreas Stiller, Zeitfenster, kleiner Exkurs zum Thema Zeitmessung und PC, c't 9/2005, S.168-171