Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi COM-Port ansteuern (Bsp: Modelleisenbahn) (https://www.delphipraxis.net/56359-com-port-ansteuern-bsp-modelleisenbahn.html)

Matze 4. Nov 2005 15:09


COM-Port ansteuern (Bsp: Modelleisenbahn)
 
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:

Delphi-Quellcode:
var
  ComHandle : THandle;
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);


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz