Hallo,
ich habe folgendes Problem:
Ich möchte ein Märklin-Interface über einen Comport mittels Win-
Api ansteuern. Das funktioniert soweit einwandfrei, aber nur, wenn ich zuvor einmal eine Verbindung mit einem alten C++ Programm hergestellt und wieder geschlossen habe. Bis zu einem Windows-Neustart gibt es dann keine Probleme mehr.
Hier mal der Code für ein kleines Testprogramm. (Der Code ist aus dem eigentlichen Programm herauskopiert, es besteht aber dasselbe Problem)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Port :
String;
befehl : Char;
ComHandle : THandle;
DCB : TDCB;
TimeOut : TCommTimeouts;
i1,i2 : integer;
begin
Port := '
Com2';
ComHandle := CreateFile(pChar(Port), GENERIC_READ
OR GENERIC_WRITE,
0,
nil, OPEN_EXISTING, 0, 0);
if ComHandle > 0
then begin
DCB.DCBlength := SizeOf(DCB);
DCB.ByteSize := 8;
DCB.Parity := NoParity;
DCB.StopBits := TWOSTOPBITS;
DCB.BaudRate := 2400;
GetCommTimeOuts(ComHandle, TimeOut);
TimeOut.ReadIntervalTimeOut := 100;
TimeOut.ReadTotalTimeoutMultiplier := 0;
TimeOut.ReadTotalTimeoutConstant := 1;
TimeOut.WriteTotalTimeoutMultiplier := 0;
TimeOut.WriteTotalTimeoutConstant := 0;
SetCommTimeouts(ComHandle, TimeOut);
end;
befehl := chr(97);
// Befehl für globales Abschalten der Gleisspannung
i1 := FileWrite(ComHandle, befehl, 1);
sleep(2000);
// Damit Meine langsamen Augen die Anzeige auf der Control Unit auch sehen
befehl := chr(96);
// Gleisspannung wieder freigeben
i2 := FileWrite(ComHandle, befehl, 1);
ShowMessage(IntToStr(ComHandle) + '
, ' + IntToStr(i1) + '
,' + IntTostr(i2));
// Nur zur Überprüfung
FileClose(ComHandle);
ComHandle := 0;
end;
Die Werte von DCB und TimeOut sind identisch mit denen des C++ Programmes.
Woran kann das liegen?
Gruß
Hlware