AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tcomport on RXChar Problem

Ein Thema von PhilmacFLy · begonnen am 5. Okt 2012 · letzter Beitrag vom 28. Jun 2022
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#1

Tcomport on RXChar Problem

  Alt 5. Okt 2012, 07:38
Moin DPler
Ich habe folgendes Problem, ich bekommen über einen virtuellen Comport Daten zu gesendet mit 115200 Baud. Nun wollte ich mit dem OnRxChar event der Komponente arbeiten. Nur leider feuert die keine Events. Wenn ich aber über einen Timer
Delphi-Quellcode:
procedure TForm2.Timer1Timer(Sender: TObject);
var
  Str: String;
begin
  ComPort1.ReadStr(Str, 10);
  if str <>'then
  memo2.Lines.Add(stringtohex(str));
end;
die Daten ausles, ist was da.
Jemand eine Idee woran das liegen könnte?
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Tcomport on RXChar Problem

  Alt 10. Okt 2012, 09:56
Ich push das hier nochmal aus gegebenen Anlass
Tante Edit meinte noch:
Grad hats mal kurz funktioniert, hatte die Buffer size in der Tcomport auf 4096 hoch gestellt, dann hats kurz geklappt, jetzt aber wieder tote hose.

Tante Edit mütterlicher seits meinte:
Hab grad in den Gerätemanager geschaut, der hatte Probleme mit dem Gerät angezeigt. Hab jetzt die latencytime auf 1 gesetzt und vorher neu angesteckt. Jetzt wuppts

Edit 3:
Glück war nur von kurzer dauer, kaum hatte ich den 2 Edit verfasst hats wieder einfach aufgehört zu laufen.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"

Geändert von PhilmacFLy (10. Okt 2012 um 10:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Tcomport on RXChar Problem

  Alt 10. Okt 2012, 10:21
Hast du denn einen EventChar definiert, damit das OnRxChar gefeuert wird?

So reagiere ich auf neue Daten:

Delphi-Quellcode:
procedure TRS232Thread.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Received: string;
  CRPosition: Integer;
begin
  (Sender as TComPort).ReadStr(Received, Count);
  FResponse := FResponse + Received;
  CRPosition := Pos(Chr(13), FResponse);
  if CRPosition > 0 then
  begin
    FReceivedStr := Copy(FResponse, 1, CRPosition);
    FResponse := '';
    if MeasureDataValid(FReceivedStr, FValue1, FValue2) then
      Synchronize(DoOnDataRead);
  end;
  FCycles := 0;
end;
Versuchs mal so, ich weiß ja nicht wie das Intervall deines Timer ist:

Delphi-Quellcode:
procedure TForm2.Timer1Timer(Sender: TObject);
var
  Str: String;
begin
  (Sender as TTimer).Enabled := False;
  try
    ComPort1.ReadStr(Str, 10);
    if str <>'then
      memo2.Lines.Add(stringtohex(str));
  finally
    (Sender as TTimer).Enabled := True;
  end;
end;
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es

Geändert von divBy0 (10. Okt 2012 um 10:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Tcomport on RXChar Problem

  Alt 10. Okt 2012, 10:47
Ich reagier jetzt so drauf

Delphi-Quellcode:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: String;
  first, last: Integer;
begin
  (Sender as TComport).ReadStr(Str, Count);
  if str <>'then
  begin
  empf := empf + stringtohex(str);
  end;
  if pos('BB BB', empf) > 0 then
  begin
    first := pos('AA AA', empf);
    last := pos('BB BB', empf);
    if last < first then
      begin
      delete(empf, 1, last+5);
      end
    else
      begin
        memo1.Lines.Add(Copy(empf, first+5, last-7));
        //parser.push(empf);
        with TParserthread.Create(empf) do
          begin
            Priority := tpHighest;
            Resume;
          end;
        delete(empf, 1, last+5);
      end;
  end;

end;
Und das scheint zu funktionieren.
Ich lass es jetzt noch n bisschen länger laufen und meld mich nochmal.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Tcomport on RXChar Problem

  Alt 10. Okt 2012, 11:21
So wie beschrieben nutze ich das einem Thread und lesen Daten von mehreren Messgeräten. Die Variante läuft in verschiedenen Anwendungen 24/7 und es gab noch keine Probleme.
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
BergLoewe

Registriert seit: 20. Nov 2005
35 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Tcomport on RXChar Problem

  Alt 10. Jun 2022, 09:01
Hallo,


ich greif mal den alten Tröt auf, weil er meinem aktuellen Problem am nächsten kommt.

Ich habe eine FMX-Anwednung und dazu die Winsoft-Komponente installiert:
https://www.winsoft.sk/comport.htm

Nun will ich Hex-Daten zu einem Controller schicken und welche empfangen. Nur Hex, also Bytes, keine Ansi-Chars oder ähnliches. Weshalb ich keine Ende-Erkennung habe. Das Protokoll, das der Controller verwendet, läßt sich nicht ändern, weil ich Geräte mit einbeziehen muß, die seit Jahren im Feld sind.

Nun hab ich das Problem, dass OnRxChar eigentlich das einzige Event ist, das sich zum Empfang nutzen läßt. Aber es tritt nach jedem empfangenen Byte auf. Nur, wenn ich nach jedem Byte selbiges einsammeln und in ein TByte-Array oder ähnliches schreiben will, tritt zwangsläufig der Fall auf, dass während des Ausführens dieser Routine der Empfang ja weiterläuft und sich die empfangenen Daten ändern. Das führt zu Fehlern.
Weshalb ich nun die Erleuchtung hatte, die einem der obigen Kommentatoren auch kam - ich setze einen Timer auf 100ms und lese dann erst die Daten aus. Nach 100ms müßte jede denkbare Sendung durch sein. Das hieße, dass OnRxChar meinen Timer starten müßte.

UNd da kommt das Problem: In dieser OnRxChar-Routine reagiert der Timer.Enable nicht.
Code:
procedure TForm1.CP1RxChar(Sender: TObject);
begin
     Timer1.Enabled := True;
end;
Das macht der nicht.

Nehm ich einen Button, kann ich den Enabled ein- und ausschalten, wie ich will.
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
    Timer1.Enabled := not Timer1.Enabled;
end;
Da klappt das bestens. Aber in der OnRxChar gar nicht. Genau genommen ändert sich das Property auf True aber der Timer löst kein Event aus.

Gäb's dazu eine Erklärung?

Geändert von BergLoewe (10. Jun 2022 um 09:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#7

AW: Tcomport on RXChar Problem

  Alt 10. Jun 2022, 09:15
Warum nicht die Daten auslesen, merken und wenn genug verarbeiten? (siehe #3)




Kommt das Event in einem Thread an? (glaub schon)

wenn ja, dann TThread.Synchronize oder besser TThread.Queue


Die Memo1.Lines.Add, in den oberen Antworten, funktionieren "zufällig", da sie intern SendMessage nutzen und sich so indirekt synchronisieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (10. Jun 2022 um 09:19 Uhr)
  Mit Zitat antworten Zitat
BergLoewe

Registriert seit: 20. Nov 2005
35 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Tcomport on RXChar Problem

  Alt 10. Jun 2022, 09:44
Es ist ja blöderweise nicht bekannt, wann die Sendung zu Ende ist. Keine Anzahl an Bytes, keine Ende-Erkennung durch ein bestimmtes Zeichen. Den Kommentar #3 hatte ich so verstanden, dass der nach "CHR(13)" sucht und damit sein Ende definiert. Bzw. eben auch mit einem Timer arbeitet, wie ich es vorhabe.


Hinsichtlich Threads muß ich ehrlich eingestehen, dass mein Wissen in solche Tiefen nicht reicht. Ich habe in der Anwendung keine Threads vereinbart. Wenn Delphi hier selbstständig auf verschiedene Threads verteilt, weiß ich nicht, wie genau ich das auseinanderhalten oder auf einen anderen Thread zugreifen soll.
Dann aber wär's dennoch irgendwie komisch. Schalte ich den Timer per Button-Click ein, geht's. Schalte ich den in der OnRxChar ein, reagiert der Timer nicht auf den dann wahren Enabled, bzw. läßt das Timer-Event im gleichen Thread aufschlagen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#9

AW: Tcomport on RXChar Problem

  Alt 10. Jun 2022, 10:12
Du brauchst so oder so eine Ende-Erkennung, bzw. ob es (mindestens) genug Daten sind.

erstmal irgendwie alles mitschneiden
Delphi-Quellcode:
(Sender as TComPort).ReadStr(Received, Count);
FResponse := FResponse + Received;
oder eben Binär als ByteArray oder Stream lesen+speichern



bezüglich des Timers mußt du ihn im Event beenden und neu starten, damit die Zeit erst nach dem letzten Empfang, im Intervall, verarbeitet wird.
"Nochmal" auf True setzen, wenn schon True war, startet die Zeit nicht neu.

Oder den Timer immer laufen lassen, bzw. beim ersten Empfangen starten
dann auch noch die Empfangszeit merken oder im Timer prüfen, ob sich seit dem letzten OnTimer etwas (Zeit oder Daten im Puffer) geändert hat
und wenn vorher, aber nicht beim letzten Mal, geändert, dann erst verarbeiten (und im Notfall auch noch wenn "zuviele" Daten vorhanden sind, die auf jeden Fall ausreichen, falls etwas hing)




In einem ähnlichen Fall hatte ich bei jedem Empfang geprüft ob eine Mindestmenge an Daten vorhanden sind (der Header)
und dann versucht die Daten zu dekodieren ... gab es Probleme, weil noch was fehlt, dann Abbruch und später nochmal, wenn wieder Neues rein kommt. (wenn erfolgreich verarbeitet, dann diese Daten aus dem Puffer löschen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (10. Jun 2022 um 10:14 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#10

AW: Tcomport on RXChar Problem

  Alt 10. Jun 2022, 19:09
Hallo,

muss es diese Komponente sein?
Alternativ mal TComPortDrv aus GetIt probiert?

Die liefert nicht nur Zeichen für Zeichen...

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz