Entwickler-Ecke

Sonstiges (Delphi) - CommConfigDialog


henke1985 - So 05.03.06 17:57
Titel: CommConfigDialog
Hi,
ich habe ein Problem mit dem ComConfigDialog, der sich bei mir einfach nicht öffnen will.
Meine serielle Schnittstelle steuere ich wie folgt an:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
function TRS232.OpenComPort(): boolean;
var
  TimeOuts : TCommTimeOuts;
begin
  Result := false;
  if CConn then exit;
  StrPCopy(CNumm,'COM' + IntToStr(PortNum));
  CHandle := CreateFile(CNumm, Generic_Read or Generic_Write, 0 , nil, OPEN_EXISTING, 00);
  if CHandle <> Invalid_Handle_Value then
  begin
    CConn:= true;
    SetupComm(CHandle,1,1);
    SetCommState(CHandle, CConf.DCB);
    GetCommTimeouts(CHandle,Timeouts);
    TimeOuts.ReadIntervalTimeout := 100;
    Timeouts.ReadTotalTimeoutMultiplier:= 100;
    Timeouts.ReadTotalTimeoutConstant:= 0;
    TimeOuts.WriteTotalTimeoutMultiplier := 100;
    TimeOuts.WriteTotalTimeoutConstant := 0;
    SetCommTimeouts(CHandle,Timeouts);
    Result := true;
  end;
end;

procedure TRS232.CloseComPort();
begin
  if CConn then
  begin
    PurgeComm
    (CHandle,PURGE_RXABORT or PURGE_RXCLEAR or PURGE_TXABORT or PURGE_TXCLEAR);
    CloseHandle(CHandle);
  end;
  CConn := false;
end;


Wenn ich vor dem ersten Öffnen mit "OpenComPort" den Befehl: CommConfigDialog(CNumm,CHandle,CConf) ausführe, klappt das einwandfrei. Habe ich aber zur Laufzeit meines Programms die Schnittstelle offen gehabt und sie wieder mit "CloseComPort" geschlossen, gibt mir der "CommConfigDialog" als Fehlermeldung 1223 (ERROR_CANCELLED) zurück. Was mache ich falsch bzw. was habe ich in CloseComPort vergessen?


digi_c - So 05.03.06 18:10

Da stehen leider keine Deklarationen für die letzten beiden Parameter im Code, am besten auch mal mit dem Debugger schauen, was du für Werte da wirklich übergibst.


henke1985 - So 05.03.06 18:19
Titel: Nachtrag

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
type
  TRS232 = class(TObject)
    function HexToInt(hex : string): integer;
    function CRC_16(Daten : array of byte; Laenge : byte): integer;
    function OpenComPort(): boolean;
    procedure CloseComPort();
  public
    CConn : boolean;
    CHandle: THandle;
    CNumm: array[0..80of Char;
    CConf: TCommConfig;
  end;

procedure Tirgendwas.startGeraetJ;
begin
  J232 := TRS232.Create;
  J232.CConn := false;
  J232.CConf.dwSize:= SizeOf(J232.CConf);
end;

procedure Tirgendwas.schreibeSetup(Baud: cardinal; Bytes, Parity, StopBits: byte);
begin
  J232.CConf.dcb.BaudRate := Baud;
  J232.CConf.dcb.ByteSize := Bytes;
  J232.CConf.dcb.Parity := Parity;
  J232.CConf.dcb.StopBits := StopBits;
end;


"startGeraetJ" wird natürlich vor dem anderen ausgeführt.


henke1985 - Mi 08.03.06 15:13
Titel: Lösung
Alles klar, ich hab die Lösung:

Das Handle, das ich dem CommConfigDialog als Parameter übergebe, muss dass Handle eines Formulares (des MainForms?!) sein, nicht das Schnittstellen-Handle.