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