![]() |
Probleme Empfang TComPort DataPacket
Hallo,
ich hab in meinem Programm ein seltsames Phänomen. Leider weiss ich nicht warum dies so passiert. Ich habe sehr viele Events in meinem Code festgelegt da ich mit einem Microcontroller kommuniziere. Das Programm ist für ein Schulprojekt von mir. Ich habe im Objektinspektor den StopString eingetragen auf welche Bytes er reagieren soll. Zum Programm : Es sollen 2 Messwicklungen getestet werden. Delphi schickt die Anweisungen, der µC führt aus und schickt Rückmeldungen. Bei der ersten Messwicklung funktioniert alles wie es soll, bei der zweiten , die genauso aufgebaut ist funktioniert die gestartet procedure einfach nicht. Vielleicht hat jemand Tips dazu und kann mir vielleicht helfen.... Das Problem ist , wenn ich die Zweite Kurzschlussprüfung aufrufe , dann kommt immer Kurzschluss , obwohl im OI richtig zugewiesen.
Code:
// Prüfplan erste Messwicklung
//****************************************************************************** //Kurzschlussprüfung der ersten Messwicklung 4/3 (--> mController) //------------------------------------------------------------------------------ procedure TForm1.Starte_Kurz_Pruef_Messw1; var Kurzschluss_var : Integer; begin Kurzschluss_var := $01; ComPort.ClearBuffer(true,true); if messagedlg('Starte Kurzschlussprüfung',mtInformation,[mbyes,mbno],0)=mryes then try ComPort.Write(Kurzschluss_var,SizeOf(Kurzschluss_var)) except on E: Exception do MessageDlg('Error: ' + E.Message, mtError, [mbOK], 0); end else showmessage('Messung beendet'); end; //Wandlersimulation gestartet erste Messwicklung (--> mController) //------------------------------------------------------------------------------ procedure TForm1.Starte_WandlerSim1; var Wandlersim_var : Integer; begin Wandlersim_var := $04; if messagedlg('Starte Wandlersimulation',mtInformation,[mbyes,mbno],0)=mryes then try ComPort.Write(Wandlersim_var, SizeOf(Wandlersim_var)) except on E: Exception do MessageDlg('Error: ' + E.Message, mtError, [mbOK], 0) end else showmessage('Messung beendet'); Buttons_sperren; end; //Kurzschlussanzeige erste Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Kurzschluss_Messw1Packet(Sender: TObject; const Str: String); begin Label1.Caption := ('Kurzschluss 1'); end; //Kurzschlussprüfung bestanden erste Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Kurzschluss_Messw1_bestPacket(Sender: TObject; const Str: String); begin Label1.Font.Color :=clLime; Label1.Caption := ('Kurzschlussprüfung bestanden'); Starte_WandlerSim1; end; //Kurzschlussprüfung gestartet erste Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Kurzschluss1_Messw1_gestPacket(Sender: TObject; const Str: String); begin Label1.Font.Color :=clLime; Label1.Caption := ('Kurzschlussprüfung 1 gestartet'); end; //Wandlersimulation OK erste Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Wandler1_gestPacket(Sender: TObject; const Str: String); var Wandlersim_best : Integer; Wandlersim_nbest : Integer; begin Label1.Caption := ('Simulation gestartet'); Wandlersim_best := $05; if messagedlg('Wandlersimulation OK?',mtInformation,[mbyes,mbno],0)=mryes then begin try ComPort.Write(Wandlersim_best, SizeOf(Wandlersim_best)) except on E: Exception do MessageDlg('Error: ' + E.Message, mtError, [mbOK], 0) end end else begin try Wandlersim_nbest := $06; ComPort.Write(Wandlersim_nbest, SizeOf(Wandlersim_nbest)) except on E: Exception do MessageDlg('Error: ' + E.Message, mtError, [mbOK], 0); end; begin Starte_WandlerSim1; end; end; end; //Wandlersimulation beendet erste Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Wandler1_beendetPacket(Sender: TObject; const Str: String); begin Label1.Caption := ('Simulation beendet'); ComPort.ClearBuffer(true,true); end; //############################################################################## // Prüfplan zweite Messwicklung //****************************************************************************** //Kurzschlussprüfung der zweiten Messwicklung 5/2 (--> mController) //------------------------------------------------------------------------------ procedure TForm1.Starte_Kurz_Pruef_Messw2; var Kurzschluss_var2 : Integer; begin Kurzschluss_var2 := $02; ComPort.ClearBuffer(true,true); if messagedlg('Starte Kurzschlussprüfung',mtInformation,[mbyes,mbno],0)=mryes then try ComPort.Write(Kurzschluss_var2,SizeOf(Kurzschluss_var2)) except on E: Exception do MessageDlg('Error: ' + E.Message, mtError, [mbOK], 0); end else showmessage('Messung beendet'); end; //Wandlersimulation gestartet zweite Messwicklung (--> mController) //------------------------------------------------------------------------------ procedure TForm1.Starte_WandlerSim2; var Wandlersim_var : Integer; begin Wandlersim_var := $07; if messagedlg('Starte Wandlersimulation',mtInformation,[mbyes,mbno],0)=mryes then try ComPort.Write(Wandlersim_var, SizeOf(Wandlersim_var)) except on E: Exception do MessageDlg('Error: ' + E.Message, mtError, [mbOK], 0) end else showmessage('Messung beendet'); Buttons_sperren; end; //Kurzschlussanzeige zweite Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Kurzschluss_Messw2Packet(Sender: TObject; const Str: String); begin Label1.Font.Color :=clRed; Label1.Caption := ('Kurzschluss 2'); end; //Kurzschlussprüfung bestanden zweite Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Kurzschluss_Messw2_bestPacket(Sender: TObject; const Str: String); begin Label1.Font.Color :=clLime; Label1.Caption := ('Kurzschlussprüfung bestanden'); Starte_WandlerSim2; end; //Kurzschlussprüfung gestartet zweite Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Kurzschluss_Messw2_gestPacket(Sender: TObject; const Str: String); begin Label1.Font.Color :=clLime; Label1.Caption := ('Kurzschlussprüfung 2 gestartet'); end; //Wandlersimulation OK zweite Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Wandler2_gestPacket(Sender: TObject; const Str: String); var Wandlersim_best : Integer; Wandlersim_nbest : Integer; begin Label1.Caption := ('Simulation gestartet'); Wandlersim_best := $08; if messagedlg('Wandlersimulation OK?',mtInformation,[mbyes,mbno],0)=mryes then begin try ComPort.Write(Wandlersim_best, SizeOf(Wandlersim_best)) except on E: Exception do MessageDlg('Error: ' + E.Message, mtError, [mbOK], 0) end end else begin try Wandlersim_nbest := $09; ComPort.Write(Wandlersim_nbest, SizeOf(Wandlersim_nbest)) except on E: Exception do MessageDlg('Error: ' + E.Message, mtError, [mbOK], 0); end; begin Starte_WandlerSim2; end; end; end; //Wandlersimulation beendet erste Messwicklung (<-- mController) //------------------------------------------------------------------------------ procedure TForm1.Com_Wandler2_beendetPacket(Sender: TObject; const Str: String); begin Label1.Caption := ('Simulation beendet'); ComPort.ClearBuffer(true,true); end; |
AW: Probleme Empfang TComPort DataPacket
Wieso hast du so viele Ereignisse zum empfangen von Daten? Eins reicht doch völlig aus und darin wertest du die Antwort aus.
Kommt denn bei der 2. Messung auch das richtige Ergebnis zurück? |
AW: Probleme Empfang TComPort DataPacket
In deinem Code sehe ich nicht, wie du Daten empfängst.
Achtung unter Delphi7 sind AnsiChar Char. Bei meinem Laufbandprojekt empfange ich so und reagiere darauf:
Delphi-Quellcode:
Bei Messungen würde ich aber mit Checksummen arbeiten, um Falschmessungen auszuschliessen.
const
Co_PAUSE = 2; Co_SCHNELLSTART = 3; procedure TMainForm.ComPortRxChar(Sender: TObject; Count: Integer); var A: String; C: AnsiChar; I: Integer; begin if Count = 1 then begin ComPort.Read(C, 1); case Ord(C) of Co_PAUSE : begin if pan_start.Caption = 'Pause' then pan_start.OnClick(self); end; Co_SCHNELLSTART: begin end; Co_SCHNELLSTOP : begin end; Co_LANGSAMSTART: begin end; Co_LANGSAMSTOP : begin end; Co_AUFSTART : begin end; Co_AUFSTOP : begin end; Co_ABSTART : begin end; Co_ABSTOP : begin end; end; end else begin for I := 1 to Count do begin ComPort.Read(C, 1); A := A + Char(C); end; lab_IstAnalog.Caption := A; end; end; |
AW: Probleme Empfang TComPort DataPacket
@divBy0
Ja das hab ich mir auch schon überlegt. Jedoch fehlt mir da ein Ansatz wie ich das auswerten soll. Denke das wird mit dem Start und stopstring gemacht.mjedoch wie die syntax dazu aussehen soll weiß ich nicht genau.... Wie gesagt , vom Controller wird "Kurzschluss2 gestartet" gesendet , jedoch wird nicht das richtige Paket angesprochen. Im weiteren Verlauf des Ablaufs klappt alles wie es soll. Vielleicht hat ja einer von euch einen Ansatz zum auswerten , dann könnte ich das ganze umschreiben. Empfangen werden die Daten über die TComDataPacket . Dort kann ich einen Start und im objektinspektor definieren. |
AW: Probleme Empfang TComPort DataPacket
Wie sieht denn dein Protokoll vom PC zum µC aus?
|
AW: Probleme Empfang TComPort DataPacket
Beim Packet wäre ja auch zu überlegen, ob die mit einem Start und Stop Event arbeiten kannst.
Ansonsten, kannst Du eventuell die Datenmenge etc. prüfen. Die Frage wäre erst mal, wie genau sehen die Daten aus die Du empfangen willst? Gruß Jens |
AW: Probleme Empfang TComPort DataPacket
Also ich muss dazu sagen das ich noch nicht allzu.ange delphi programmiere und vielleicht das eine oder andere Nicht genau kenne.
Der Empfang der Daten ist Byte weise.... Denke ich mal.... Der Controller schickt. z.B. Die Zeichenkette Kurzschluss2 gestartet. Jetzt soll der Eventhandler die Procedure messwick2 gest aufrufen und mir die Anweisung ausführen. Bei den meisten Sachen klappt es, aber manchmal eben nicht. Im ersten Prüfplan funktioniert es immer, bei dem zweiten startet zwar die kurzschlussprüfung aber er zeigt mir immer "Kurzschluss" in roter Schrift an. Dies deutet immer darauf hin das die Procedure Kurzschluss messwick2 aufgerufen wird. Aber warum kann ich nicht sagen.. |
AW: Probleme Empfang TComPort DataPacket
irgendwie fehlt der Code der die Rückgabe (OnRxChar o.ä.) behandelt?
|
AW: Probleme Empfang TComPort DataPacket
So kannst du z.B. auf die verschiedenen Kommandos reagieren:
Delphi-Quellcode:
@Bummi: Der Empfang müsste über TComDataPacket laufen.
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);
begin if Str = 'Kurzschluss2 gestartet' then begin // Code für Kurzschluss2 gestartet end; end; |
AW: Probleme Empfang TComPort DataPacket
Ich hab das eben mal so probiert wie divBy0 es beschrieben hat. Ab und an mal funktioniert es richtig , aber manchmal kommt auch gar nix zurück.
Habe eben mal als Ausgabe wenn der String emfangen wurde eine Showmessage eingefügt. Aber mal wird es angezeigt mal nicht. Muss ich vielleicht den Buffer löschen damit nicht zuviel Unsinn drinnen steht , und wie könnte ich diesen löschen oder woran könnte dies liegen?
Delphi-Quellcode:
BEim ersten mal funktioniert der Empfang und die Ausgabe.Starte ich es noch einmal kommt nix mehr. :-(
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);
begin if Str ='Kurzschluss1 gestartet' then begin // Code für Kurzschluss2 gestartet showmessage('Kurzschluss1 gestartet !!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); end else if Str ='Kurzschluss1 bestanden' then begin showmessage('Kurzschluss1 bestanden 8746759837684376') end end; Es scheint wohl so das irgendwie Leerzeichen oder sowas noch im Buffer sind ,die dann dazu führen das der String nicht komplett ist...Deswegen wird er auch manchmal nicht erkannt. Aber wie ich das löse , keine Ahnung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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