s.h.a.r.k hat
hier ein Vorgehen zum Ansteuern des
COM-Ports beschrieben. Hier als konkretes Beispiel, wie man eine (Märklin-) Modelleisenbahn ansteuern könnte. Natürlich ist für eine komplexere Ansteuerung deutlich mehr Aufwand notwendig.
Globale Variable für das Ansprechen des
Com-Ports:
Globale Konstante unter dem var-Teil:
Delphi-Quellcode:
const
{ Einstellungen für die Weichenstellung }
rund = 34;
gerade = 33;
{ Pausen für verschiedene Impulse, da es manschmal länger dauern muss
dass es funktioniert - v.a. bei den Weichen }
befehlspause = 100;
weichenimpulse = 200;
Um eine Verbindung zum
COM-Port zu trennen nutzt man diesen Befehl:
Delphi-Quellcode:
FileClose(ComHandle);
ComHandle := 0;
Die Verbindungsprocedure kann wie folgt aussehen (inkl Disconnect):
Delphi-Quellcode:
procedure ConnectToCOMPort(Disconnect: Boolean);
var
DCB : TDCB;
TimeOut : TCommTimeouts;
i : Integer;
begin
{ Wenn die Verbindung wieder getrennt werden soll }
if (Disconnect)
then
begin
FileClose(ComHandle);
ComHandle := 0;
exit;
end;
{ Die Verbindung zum COM-Port wird hergestellt - wenn dies nicht funktioniert
wird es bis zu zehn Mal probiert }
i := 0;
while (ComHandle <= 0)
and (i < 10)
do
begin
ComHandle := CreateFile(pchar(COMCB.Text), GENERIC_READ
or GENERIC_WRITE,
0,
nil, OPEN_EXISTING, 0, 0);
inc(i);
end;
{ Einstellungen zum COM-Port zuweisen, wenn die Verbindung aktiv ist }
if (ComHandle > 0)
then
begin
DCB.DCBlength := SizeOf(DCB);
DCB.ByteSize := 8;
DCB.Parity := NoParity;
DCB.StopBits := TWOSTOPBITS;
DCB.BaudRate := 2400;
DCB.Flags := 5123;
{ Wenn 2 Pins belegt sind }
DCB.EofChar := #0;
DCB.ErrorChar := #0;
DCB.EvtChar := #0;
DCB.XoffChar := #0;
DCB.XoffLim := 0;
DCB.XonChar := #0;
DCB.XonLim := 0;
SetCommState(ComHandle, DCB);
GetCommTimeOuts(ComHandle, TimeOut);
TimeOut.ReadIntervalTimeOut := 100;
TimeOut.ReadTotalTimeoutMultiplier := 0;
TimeOut.ReadTotalTimeoutConstant := 250;
TimeOut.WriteTotalTimeoutMultiplier := 0;
TimeOut.WriteTotalTimeoutConstant := 200;
SetCommTimeouts(ComHandle, TimeOut);
end;
end;
Mit dieser Funktion schickt man Daten an den
COM-Port:
Delphi-Quellcode:
function WriteDataToCOMPort(Text:
String): Boolean;
var
i : Integer;
begin
{ Senden der Daten an den COM-Port - mit Ausgabe ob der Befehl
erfolgreich war }
i := FileWrite(ComHandle, Text[1], Length(Text));
if (i <> Length(Text))
then Result := False
else Result := True;
end;
Jetzt mal ne kleine Auflistung an Befehlen:
Befehle:
WriteDataToComPort(chr(96)):
Starten des Interface -> Entspricht "GO"-Taste
WriteDataToComPort(chr(97)):
Nothalt -> Entspricht "Stop"-Taste
WriteDataToCOMPort(chr(Speed)+chr(LokAddr)):
Einstellungen an der Lok (Wenn die Sonderfunktion aktiviert werden soll, dann muss die Speed + 16 genommen werden)
WriteDataToCOMPort(chr(Direction)+chr(Addr)):
Schalten einer Weiche - Direction ist hier rund oder gerade (siehe Konstanten) allerdings sollte danach folgender Code stehen
Delphi-Quellcode:
sleep(weichenimpulse);
WriteDataToCOMPort(chr(32));
sleep(befehlspause);