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
Benutzerbild von himitsu
himitsu

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

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.
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 20. Nov 2005
37 Beiträge
 
Delphi 11 Alexandria
 
#2

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
44.745 Beiträge
 
Delphi 12 Athens
 
#3

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)
Ein Therapeut entspricht 1024 Gigapeut.

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
3.099 Beiträge
 
Delphi 12 Athens
 
#4

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
Benutzerbild von himitsu
himitsu

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

AW: Tcomport on RXChar Problem

  Alt 10. Jun 2022, 21:39
macht TComPort auch nicht ... es liefert garkeine Zeichen. (es sagt, gerade war was reingekommen und x Zeichen sind aktuell im Puffer)

OnRxChar liefert quasi 1 bis x Zeichen, je nach dem, wieviel bereits im Buffer gelandet ist und noch nicht abgeholt wurde, z.B. mit ReadStr.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
BergLoewe

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

AW: Tcomport on RXChar Problem

  Alt 13. Jun 2022, 10:02
Hallo,


vielen Dank erst mal, dass Ihr Euch meiner Probleme annehmt! Ich hatte am Wochenende leider keine Zeit, da meine Enkelin ihren großen Tag hatte und meine Angetraute etliches am Haus gemacht haben wollte. Daher erst jetzt ein Response.

Ich habe es jetzt zunächst mal so gemacht, dass ich den Timer beim Senden starte. Das ist nicht ideal, weil damit die Reaktionszeit der Gegenseite mit berücksichtigt werden müßte und die kann sehr unterschiedlich sein. Aber jetzt zum reinen Testen erst nmal so.
Im Prinzip geht das so. Leider aber nicht immer. Stochastisch zeigt der mir mitunter falsche Daten und vor allem falsch Byte-Anzahlen an. Und irgendwann hängt sich die App dann ganz auf.

Ich versuch's jetzt doch erst mal mit einer anderen Komponente. Aber ich nehm die ASync von TMS. MIt der habe ich vor 10 oder 12 Jahren schon mal sowas gemacht, damals unter Delphi2005. Die Winsoft wollte ich, weil die auch unter FMX läuft, die TMS wohl nicht. Die Anwendung soll später mal auch auf anderen Platformen laufen. Dann auch per WLAN oder Bluetooth. Deshalb habe ich das -was mir völliges Neuland ist- unter FireMonkey angefangen und wollte eben zunächst einmal das ganze via USB/RS232 aufbauen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Tcomport on RXChar Problem

  Alt 13. Jun 2022, 10:52
Wenn garnichts geht, dann kannst du es auch selbst machen ... am Besten in einem Thread, falls zwischen zwei Empfängen zu viel Zeit vergeht und der Haupthtread dann immer wieder etwas hängt.


CreateFile+ReadFile, wobei man ReadFile+Overlapped auch im Hauptthread asynchron nutzen könnte (ohne hängen)
oder TFileStream, bzw. THandleStream+CreateFile und Stream.Read***
oder Assign+Read (das alte Pascalzeugs)
oder ...

und als Dateiname z.B. 'COM1' bis 'COM9'
so lange im Windows als Standard bereits die richtige Config (Baud, StopBits, Parität usw.) eingestellt ist, mußt du im Programm nichts weiter machen.
wenn doch nicht, dann MSDN-Library durchsuchenSetCommState nach dem CreateFile -> https://docs.microsoft.com/de-de/win...tions-resource


also im Thread die "Datei" (Gerät) öffnen
ein oder mehere Byte auslesen (read) ... es wird ohne Overlapped bestimmt gewartet, bis diese x Bytes da und gelesen sind (darum im Thread)
eventuell die Bytes in einer Variable (TBytes bzw. TArray<Byte>) zwischenspeichern
und dann via Synchronize oder Queue in den Haupthtead damit (oder wenn möglich auch direkt im Thread verarbeiten und das Ergebnis in den Hauptthread)
Ein Therapeut entspricht 1024 Gigapeut.

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

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

AW: Tcomport on RXChar Problem

  Alt 21. Jun 2022, 13:32
Moin,

nachdem ich nun fluchend Tage damit verlebte, andere Komponenten zu installieren und festzustellen, dass die in FMX nicht laufen, kam ich zur ursprünglichen Winsoft-Komponente zurück.

Naja, was soll ich sagen - vielleicht bin ich zu blöd, zu alt, zu blind(leider nicht zu besoffen, dann hätt ich was davon) aber jetzt läßt sich der Timer plötzlich aus der OnRxChar-Funktion heraus starten. Was er letzte Woche ums Verrecken nicht machen wollte.

Also vielen Dank dennoch, für Eure Hilfe und Eurer Verständnis.
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:55 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