Verarbeitung von RS232 Daten zu langsam



  • Hallo Leute,

    ich trete gerade mal wieder auf der Stelle.

    Meine Kommunikation zwischen µC und dem PC funktioniert soweit aber es ist alles schnarch-langsam.

    Die Schnittstelle ist auf 115200 Baud eingestellt und wenn ich die Datenpakete mit dem Oszi vermesse, dann passt das auch.

    Allerdings werden die Werte auf meiner Form nur alle 0,8 - 1 Sekunde im TEdit-Feld und anderen grafischen Modulen angezeigt.

    Wenn ich den µC über ein Terminalprogramm anspreche, das kommt die Antwort innerhalb von ca. 10 ms.
    Das passt auch, wenn ich die Verbindung über die Builder-Applikation mache.
    Zwischen Senden und Empfangen liegen 1-10 ms, aber bis der Wert angezeigt wird, vergehen Lichtjahre.

    Mache ich irgendwo einen Gedankenfehler?

    Der Einfachheit halber arbeite ich momentan mit Timern, die alle auf 50ms eingestellt sind.
    Abfolge:
    _Schnittstelle auf
    _Zeichen senden
    50ms warten
    _Daten einlesen
    _Schnittstelle schließen
    50ms warten
    _Daten verarbeiten und anzeigen
    50ms warten
    Abfolge geht wieder von vorne los

    Wenn ich also im 150 oder 200 ms Raster einen Wert angezeigt bekäme, würde ich das verstehen, aber derartige Verzögerungen verstehe ich nicht.

    Jemand eine Idee?

    Gruß

    Uwe



  • aerodactyl schrieb:

    Mache ich irgendwo einen Gedankenfehler?

    Meiner Meinung nach ziemlich viele.

    Am wichtigsten: So einen Datenempfang macht man in einem Thread, nicht in der GUI-Logik.

    Dann: GUI-Timer sind nicht sehr präzise und Timer-Messages haben unter den Windows-Messages eine sehr niedrige Priorität.

    Auch wichtig: Eine Schnittstelle macht man nicht dauernd auf und zu. Die bleibt solange offen, wie das Programm damit arbeiten will.

    Außerdem: Man wartet nicht auf Daten von der seriellen Schnittstelle. Das macht bei synchronem Lesen ReadFile selber, bei asynchronen IO nimmt man WaitForSingleObject oder ähnliches.



  • Noch ein Gedankenfehler: Lichtjahre sind keine Maßeinheit für die Zeit sondern für Entfernungen ...
    SCNR 😉



  • Auch wichtig: Eine Schnittstelle macht man nicht dauernd auf und zu. Die bleibt solange offen, wie das Programm damit arbeiten will.

    Danke für den Hinweis mit der Schnittstelle, obwohl ich da etwas verwirrt war. Ich hatte schon mal aus einer anderen Ecke gehört, dann man die Schnittstelle nicht dauernd offen lassen sollte.

    Jetzt lasse ich sie offen, alles funktioniert noch und die Performance ist jetzt auch wesentlich besser.
    Nochmals Danke für die Info.

    Außerdem: Man wartet nicht auf Daten von der seriellen Schnittstelle. Das macht bei synchronem Lesen ReadFile selber, bei asynchronen IO nimmt man WaitForSingleObject oder ähnliches.

    Ich arbeite asynchron und das Programm muss eigentlich mur die Daten vom µC einlesen und anzeigen. Viel mehr ist da nicht zu machen und von daher kann ich mir das Warten dort erlauben, auch wenn es vieleicht nicht die feine Art ist.
    Als 232 Interface nutze ich TMS-Async-32. Dort habe ich nichts gefunden, was dem "WaitForSingleObject" entspricht.
    Hast du dazu mal ein paar mehr Infos oder einen Link, wo dazu was geschrieben steht?

    Jansen schrieb:

    Noch ein Gedankenfehler: Lichtjahre sind keine Maßeinheit für die Zeit sondern für Entfernungen ...
    SCNR 😉

    😃 Genau darauf hatte ich schon gewartet 😃

    Gruß

    Uwe



  • aerodactyl schrieb:

    Ich hatte schon mal aus einer anderen Ecke gehört, dann man die Schnittstelle nicht dauernd offen lassen sollte.

    Na, dann meide diese Ecke in Zukunft besser. 🙂

    Dort habe ich nichts gefunden, was dem "WaitForSingleObject" entspricht.

    Da es eine Delphi-Komponente ist, hat sie wahrscheinlich ein Ereignis, das kommt, wenn Daten gelesen wurden.

    Auf die Vorgänge im Innern der Komponente hat man wahrscheinlich keinen großen Einfluss.

    Ganz allgemein zur WinAPI und RS232 findest du hier folgende spezielle Funktionen:
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa363194%28v=VS.85%29.aspx

    Dieser alte MSDN-Artikel war damals mein Einstieg in das Thema:
    http://www.tetraedre.com/advanced/files/msdn_serial.htm


Anmelden zum Antworten