Handshake-Leitungen
von B. Kainka, Lernpaket MSR mit dem PC

Alle direkten Zugriffe auf die Schnittstellenleitungen erfolgen hier ebenfalls über API-Funktionen. Die Ausgangsleitungen DTR, RTS und TXD lassen sich über die Funktion EscapeCommFunction setzen und zurücksetzen. Ihr werden vorbereitete Konstanten für einzelne Schaltaktionen übergeben. SETDTR und CLRDTR beeinflussen die DTR-Leitung, SETRTS und CLRRTS entsprechend die RTS-Leitung. SETBREAK setzt die TXD in den Breakzustand, schaltet sie also ein. In diesem Zustand können keine seriellen Daten verschickt werden. Mit CLRBREAK wird TXD wieder in den Ruhezustand versetzt und für die Übertragung von Bytes freigegeben.
Ganzen Artikel lesen...
Zum Lesen der Eingangszustände an CTS, DSR, RI und DCD dient die API-Funktion GetCommModemStatus. Die Funktion liefert alle Informationen des Modem-Statusregisters aus dem UART. Über vordefinierte Bitmasken kann der Zustand jeder einzelnen Leitung ausgelesen werden. Zusätzlich wird aber hier auch die Funktion INPUTS gebildet, mit der man gleich alle vier Leitungen zusammen lesen kann. Das ermöglicht eine erhebliche Zeitersparnis, wenn mehrere Eingangsleitungen abgefragt werden müssen.
procedure DTR(State:integer);
begin
if (State=0) then EscapeCommFunction(PortHandle,CLRDTR)
else EscapeCommFunction(PortHandle,SETDTR);
end;
procedure RTS(State:integer);
begin
if (State=0) then EscapeCommFunction(PortHandle,CLRRTS)
else EscapeCommFunction(PortHandle,SETRTS);
end;
procedure TXD(State:integer);
begin
if (State=0) then EscapeCommFunction(PortHandle,CLRBREAK)
else EscapeCommFunction(PortHandle,SETBREAK);
end;
function CTS():Integer;
Var mask:Dword;
begin
GetCommModemStatus(PortHandle,mask);
if (mask and MS_CTS_ON)=0 then result:=0 else result:=1;
end;
function DSR():Integer;
Var mask:Dword;
begin
GetCommModemStatus(PortHandle,mask);
if (mask and MS_DSR_ON)=0 then result:=0 else result:=1;
end;
function RI():Integer;
Var mask:Dword;
begin
GetCommModemStatus(PortHandle,mask);
if (mask and MS_RING_ON)=0 then result:=0 else result:=1;
end;
function DCD():Integer;
Var mask:Dword;
begin
GetCommModemStatus(PortHandle,mask);
if (mask and MS_RLSD_ON)=0 then result:=0 else result:=1;
end;
function INPUTS():Integer;
Var mask:Dword;
begin
GetCommModemStatus(PortHandle,mask);
INPUTS := (mask div 16) and 15;
end;
Listing 3 Die Zugriffe auf die Handshake-Leitungen

Lernen Sie die ganze Vielfalt vom Franzis Buch- und Softwareverlag kennen