HSG

Aktuelle Seite: HSG/Fächer/Informatik/Netze/Programme

Full-Duplex-Übertragung über die serielle Schnittstelle

Verbindungs-Schema 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 Klasse TNetzHW

Klassendiagramm zu TNetzHW 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.

Test-Programm

GUI des NetzHW-Testprogramms NetzHw.zip

Messungen

Messungen an NetzHW ZeitMessungen.zip

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;

Literatur-Hinweis

Andreas Stiller, Zeitfenster, kleiner Exkurs zum Thema Zeitmessung und PC, c't 9/2005, S.168-171