Autor Beitrag
henke1985
Hält's aus hier
Beiträge: 10

Win 2000, Win XP
D7
BeitragVerfasst: So 05.03.06 17:57 
Hi,
ich habe ein Problem mit dem ComConfigDialog, der sich bei mir einfach nicht öffnen will.
Meine serielle Schnittstelle steuere ich wie folgt an:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10

Win 2000, Win XP
D7
BeitragVerfasst: So 05.03.06 18:19 
Titel: Nachtrag
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10

Win 2000, Win XP
D7
BeitragVerfasst: 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.