Reaktionszeit zu lange



  • Hallo auch,

    Folgender Versuchsaufbau:

    Ich habe einen PC über eine RS232-Verbindung mit einem µC verbunden. Die Kommunikation läuft im Prinzip so ab: Der PC sendet ein einzelnes Byte vom PC zum µC. Der µC quittiert das Byte mit ebenfalls einem Byte. Der PC wartet solange bis das Quittungsbyte eingelesen ist und sendet das nächste Byte. Es werden also abwechselnd einzelne Bytes zwischen PC und µC versendet.

    Das Problem:

    Wenn der µC das Byte erhält wird unmittelbar das Quittungsbyte versendet, hier ist das Timing optimal (<100µs). Anders beim PC: Bis der PC das Byte eingelesen hat, und das nächste Byte zu senden beginnt vergeht eine Zeit von 4,23msec.

    Die Fragen:

    A: Warum dauert die Reaktion auf dem PC so lange?
    B: Wie kann ich diese Wartezeit minimieren?

    Die exakten Reaktionszeiten habe ich mit Hilfe eines Oszilloskopes bestimmt. Die Baudrate ist 9600 Baud. Programmiert habe ich das ganze mit Visual C++ 2003 mit Hilfe der MFCs. Die Serielle Schnittstelle spreche ich mit Hilfe der Klasse CSerialPort an. Ich vermute die Wartezeit entsteht beim Empfang der Quitierung, nicht beim senden des Bytes. Ich habe schon versucht das Timing mit Hilfe der struct COMMTIMEOUTS zu optimieren, jedoch ohne Resultat (war eigentlich zu erwarten, da ich nur ein Zeichen sende bzw. Empfange).

    Weis jemand Rat?

    Dank & Gruß
    beis



  • Könnte an der Empfangs-FIFO liegen. Dreh mal die Schwelle für die Empfangs-FIFO runter, oder schalt die FIFOs ganz ab. (Geht beides übern Device-Manager, genauer: über die "Eigenschaften" Dialoge des Devices).

    Ich vermute die Wartezeit entsteht beim Empfang der Quotierung, nicht beim senden des Bytes

    Das vermute ich auch.



  • Windows ist kein Echtzeit OS. Somit ist das gezeigte verhalten ganz normal.
    Wie "beis" gesagt hat, kannst Du es aber optimieren, indem Du die FIFO-Einstellungen für den Port änderst. Du musst in "Erweiterte Einstellungen für COMx" den Empfangspuffer auf "Niedrig (1)" Stellen. Der Text ist leider sehr verwirrend, da es nichts mit der Puffergröße zu tun hat, sondern nur der Wert ist, ab dem ein Interrupt ausgelöst wird.



  • Änderung der Puffergröße oder Abschalten des Puffers bringt leider nichts.

    Dass Windows kein Echtzeitbetriebssystem ist weis ich, mich wundert nur, dass die Wartezeit zwischen den Zeichen so genau 4,23msec ist. Wie wenn irgendetwas ablaufen würde, das diese Zeit verursacht.

    Grüße
    beis



  • Bei mir hat die Änderung auf 1 nach einem Neustart die Reaktionszeit auf ca. 1 ms rediziert (Thread lief aber mit höherer Priorität!). Die Priorität Deines Warte-Threads muss aber höher sein als normal. Sonst hast Du immer den "Time-Slice" Effekt von anderen Threads.
    Wie genau wartest Du denn auf Zeichen?



  • Das war der Trick:

    Der FIFO-Puffer ist zu deaktivieren. Das habe ich schon versucht gehabt, jedoch habe ich vergessen danach den Rechner neu zu starten. Nach einem Neustart funktionierte es tadellos.

    Übrigens war es bei mir nicht notwendig die Priorität des Tasks zu erhöhen.

    Vielen Dank für Eure Hilfe.

    Grüße
    beis



  • beis schrieb:

    Übrigens war es bei mir nicht notwendig die Priorität des Tasks zu erhöhen.

    Die Priorität musst Du nur dann nicht erhöhen, wenn sonst +nichts* auf dem Rechner (ständig) läuft.


Log in to reply