Forum: PC-Programmierung Delphi 7:Zu langsames Auslesen bei TComport ComPortRxChar


von Roberz (Gast)


Lesenswert?

Hallo  Leute,

ich arbeite mit Win XP mit Delphi 7 und der Komponente Comport. Beim 
Auslesen via
ComPortRxChar erfolgt eine extrem verlangsamte  Anzeige der Daten. Wird 
der Sender  (AVR, RS232) gestoppt, stoppt auch die Anzeige. Wird der AVR 
wieder eingeschaltet ,werden keine neuen Daten,  sondern noch jede Menge 
alte Daten ( wohl noch aus dem Puffer vom PC) am PC angezeigt. Erst nach 
einiger Zeit werden dann neue Daten vom AVR angezeigt
Bin ratlos, da es kein übliches Problem ist.  Der AVR sendet brav alle 
100ms ein Datenpaket mit Zähler. Das wurde mit Terminal-Programm 
getestet. Aber der PC zeigt diese Daten nur alle 1000ms an. Da alles 
über die Zeichen-Empfangsroutine der Komponente läuft und es kein 286er 
mit DOS 3.1 ist, sollte es eigentlich kein Geschwindigkeitsproblem sein. 
Die Zeichenempfangsroutine ComPortRxChar wird nicht schneller 
aufgerufen. .

Wer hat da eine Idee? Danke

von Jim M. (turboj)


Lesenswert?

Deine Auswertung der Daten ist zu langsam, vermutlich weil irgendwelche 
Anzeigen jedesmal erneuert werden.

Das kostet echt Zeit.. ;-)

Roberz schrieb:
> Aber der PC zeigt diese Daten nur alle 1000ms an.

Moderne USB2UART Interfaces haben FIFOs drin. Bei 100 ms könnten die 
noch versuchen die Daten zwecks besserer Auslastung des USB zusammen zu 
fassen.
Bei einigen Adaptern kann man in einen lower Latency Modus schalten, 
schau Dir das mal im Geräte Manager an.

: Bearbeitet durch User
von Roberz (Gast)


Lesenswert?

Anzeigen gibt es da keine, nur ein Label für den Zählerstand ;) Das kann 
es also nicht sein.

Beim USB-Virtual-Comport-Treiber kann ich nichts ausser das Übliche wie 
Baudrate und Fifo-Puffer-Größe einstellen...außerdem liest ja das 
Terminal-Programm mit wesentlich mehr Anzeigen alles problemlos in 
richtiger Geschwindigkeit aus...

von Georg (Gast)


Lesenswert?

Roberz schrieb:
> außerdem liest ja das
> Terminal-Programm mit wesentlich mehr Anzeigen alles problemlos in
> richtiger Geschwindigkeit aus...

Es würde vielleicht helfen, wenn man nicht nur einen einzigen, sondern 
soviele Zeichen auslesen würde, wie gerade verfügbar sind, es kann ja 
sein dass seit der letzten Abfrage mehr als ein Zeichen neu angekommen 
ist, und das summiert sich dann auf.

Aber wenn man nur eine kopierte Komponente verwendet, hat man darauf 
natürlich keinen Einfluss und muss die Komponente so nehmmen wie sie 
ist. Es könnte auch performanter sein, nicht einzelnen Zeichen, sondern 
eine ganze Message einzulesen (die alle 100 ms kommt), aber da gilt das 
gleiche.

Georg

von Georg (Gast)


Lesenswert?

Roberz schrieb:
> Wer hat da eine Idee?

Der Empfang eines Zeichens gehört eigentlich in den event 
TComPort.OnRxChar.

Georg

von Roberz (Gast)


Lesenswert?

und da ist es auch drin. erster Beitrag, erste Zeile  von mir....

von Huh (Gast)


Lesenswert?

Roberz schrieb:
> und da ist es auch drin. erster Beitrag, erste Zeile  von mir....

Na dann schau mal genauer hin:

Georg schrieb:
> TComPort.OnRxChar

Roberz schrieb:
> ComPortRxChar

Fällt dir was auf? ;-)

von Roberz (Gast)


Lesenswert?

ja, ich habe von der weitverbreiteten und gern genutzten Komponente den 
mitgelieferten Beispielcode richtig und originalgetreu genutzt :)

von Jim M. (turboj)


Lesenswert?

Roberz schrieb:
> ja, ich habe von der weitverbreiteten und gern genutzten Komponente den
> mitgelieferten Beispielcode richtig und originalgetreu genutzt

Und dieser Code funktioniert, ist aber arschlahm.

Hab grad nachgeschaut, wir benutzen InputCount und Read() zum schnellen 
Lesen.

von W.S. (Gast)


Lesenswert?

Roberz schrieb:
> Wer hat da eine Idee? Danke

Ich verwende die da:
"http://www.mikrocontroller.net/attachment/313034/TComPort.zip";

und zwar mit D6, D10 und Lazarus (dort etwas angepasst). Wahrscheinlich 
machst du bei deiner Komponente irgendwas mit dem Auslesen falsch.

W.S.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.