![]() |
Comport-Exception abfangen und verbindung schließen
Hallo zusammen,
seit geraumer Zeit erfreue iich mich über die Komponete TComPort. Sie funktioniert eigentlich richtig gut nur bei einer Exception geht sich richtig ab.Ich bin jetzt schon länger auf der suche nach einer Möglichkeit eine TComport-Excetion sauber abzufangen und meine Verbindung sauber zu schließen. Es handelt sich um Exception die ausgelöst wird im Falle bei dem Abbruch der Kommunikation (z.B. Kabel ziehen). Vielleicht hatte bei euch auch jemand das Problem und könnte mir einen Tip geben. Im voraus Danke :oops: |
Re: Comport-Exception abfangen und verbindung schließen
Was hast du bisher versucht? try-except-end-Blöcke? Was für eine Exception kommt genau?
|
Re: Comport-Exception abfangen und verbindung schließen
try-except funktioniert doch bestens dabei.
Welche Exception bekommst du denn? Bei mir kam noch nie ein Fehler beim Kabelziehen. |
Re: Comport-Exception abfangen und verbindung schließen
Hallo delphifant,
Zitat:
Bis bald Chemiker |
Re: Comport-Exception abfangen und verbindung schließen
Zeig mal deinen Code, wo die Exception auftritt bitte.
|
Re: Comport-Exception abfangen und verbindung schließen
Hallo erstmal danke für eure schnelle Reaktion...
Es Handelt sich hier um das ständige abfragen von Messwerten einer Elektronik...
Delphi-Quellcode:
Wegen der hohen Bautrate ist kein Software-Handshake möglich... also muß ich immer auf eine Antwort warten, damit ich auch eine Steuerung über meine Software ermöglich kann...
//++++++++++++++++++++++++++++++++++
//Sender der Message an über Comport //++++++++++++++++++++++++++++++++++ function TForm1.SendMessagetoCOM(const FTCMessage: String; const interval: word ; var ErrorMsg: String; bSetRich: Boolean): boolean; var iDelay : word; i : integer; MyChar : Char; wfmo, LoopMax : word; begin result:= false; if ComPort.Connected then begin //MPCComData ist eine globaler Variable (Record) MPCComData.text := ''; iDelay := COM_DELAY; //Const wfmo := 0; LoopMax := COM_LOOP_RECIEVED; MPCComData.bRecieved:= True; // Sender der Chars (mit einer Delay) wegen hoher Bautrate 921600 for I := 1 to length(FTCMessage) do begin MyChar:= FTCMessage[i]; ComPort.WriteStr(MyChar); delay( iDelay); end; i := 0; ErrorMsg := ''; // Schleife wird durchlaufen und bei Event oder nach Durchlauf von Loop beendet... // Rückantwort verarbeiten... repeat wfmo := WaitForMultipleObjects(length(EventRecieveds), @EventRecieveds, False, interval ); Application.ProcessMessages; //Nur bei Hautthread benötigt... inc(i); if Application.Terminated then i:=LoopMax; // oder Thread.terminated until (wfmo <> WAIT_TIMEOUT) or ( i = LoopMax); MPCComData.bRecieved:= false; if wfmo=0 then begin if bSetRich then RiCOMText.Lines.Add(MPCComData.text); result:= true; end; case wfmo of WAIT_OBJECT_0 + 0: ErrorMsg := rsEventRecieved; WAIT_OBJECT_0 + 1: ErrorMsg := rsEventCustomer; WAIT_OBJECT_0 + 2: ErrorMsg := Format(rsEventSignaled, [WAIT_OBJECT_0 + 3]); WAIT_TIMEOUT: ErrorMsg:= rsTimeOut; else ErrorMsg:= 'Error'; end; if i= LoopMax then ErrorMsg:= 'Loop to end'; end; end; //++++++++++++++++++++++++++++++++++ // Empfangen der Daten //++++++++++++++++++++++++++++++++++ procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer); var Str: String; i : integer; rxBuffer: String ; begin ComPort.ReadStr(Str, Count); if MPCComData.bRecieved then begin for i := 1 to length(str) do begin if (str[i] = #10) or (str[i] = #13) then begin MPCComData.text := rxbuffer; MPCComData.bRecieved := false; SetEvent(EventRecieveds[0]); break; end else rxbuffer:=rxbuffer+str[i]; end; end; end; Gruß Delpifant |
Re: Comport-Exception abfangen und verbindung schließen
Ich habe noch eines vergessen...
Die Exception werden zu einen eigenen Exception-Handler weitergleitet...wo sie auch ankommen.
Delphi-Quellcode:
Ok, das noch (es ist eine EComPort-Exception)
procedure TForm1.HandleOnException(Sender: TObject; E: Exception);
begin if (E is EComPort) then begin //-> Hier wird die Exception hingeleitet // Jedoch fand ich noch keinen Weg meine Exception // sauber zu verarbeiten MessageDlg(E.Message, mtError, [mbOk], 0); end else begin screen.Cursor:=crDefault; MessageDlg(E.Message, mtError, [mbOk], 0); end; end; P.S. die Sache mit dem Trigger hört sich interessant an Zitat:
|
Re: Comport-Exception abfangen und verbindung schließen
Hallo delphifant,
da war ich auf den falschen Dampfer. Ich benutze eine andere Komponente ist auch kostenlos, vielleicht lohnt es sich diese mal anzusehen. ![]() Bis bald Chemiker |
Re: Comport-Exception abfangen und verbindung schließen
Die TComport-Komponente hat viele gute Seiten...wenn ich jedoch nicht eine Möglichkeit finde das Problem zu lösen werde ich mich wohl nach Alternativen umschauen müssen. Ich habe auch die Komponente
Zitat:
|
Re: Comport-Exception abfangen und verbindung schließen
Du hast meiner Meinung nach noch keine Antwort auf die Verwendung von try...except-Blöcken gegeben. Ich verarbeite meine Exceptions von TComport damit und das funktioniert gut.
Deine Art, Daten zu empfangen, passt nicht gut zur hohen Baudrate. Ich habe das in einer Anwendung mit hoher Datenrate über einen Timer gelöst, der dann den Buffer einsammelt und sortiert. Grüße, Messie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz