Großes Problem mit serialport!



  • Hallo!

    Ich versuche über ein serialport Objekt über einen virtuellen com-Port mit einem Gerät zu kommunizieren. Die Einstellungen müssen sein:

    Baud 38400
    DataBits 8
    StopBit 1
    Parity None
    Handshaking RTS/CTS

    Mit einem Terminal Programm kann ich mit dem Gerät kommunizieren. Aus meiner Anwendung heraus geht es nur sporadisch. Als handshake habe ich RequestToSend. Anscheinend ist das Problem, dass ich manchmal Bytes verliere. Ich sollte z.B. 3 bytes empfangen, das erste kommt aber nicht an sonder nur die letzten beiden. In dem Fall time ich aus, da das letzte byte nie ankommt.

    Ich habe keine Idee mehr, woran das liegen könnte. Kennt jemand sowas?

    Danke!



  • Servus,

    zeig mal bitte eine bisschen Quellcode. Am Besten an der Stelle, an der du den Port initialisierst. Pass auf das "DiscardNull" auf false steht. Nicht das du dir selbst ausversehen bei einem "NULL" dir das Byte wegschmeisst.

    mfg
    Hellsgore

    EDIT:
    Was mir noch einfällt, kommunizierst du in Halb- oder Vollduplex mit dem Gerät?



  • Hier die Initialisierung:

    _sPort.BaudRate = 38400;
    _sPort.DataBits = 8;
    _sPort.Parity = Parity.None;
    _sPort.StopBits = StopBits.One;
    _sPort.Handshake = Handshake.RequestToSend;
    _sPort.WriteTimeout = 2500;
    _sPort.ReadTimeout = 2500;
    

    Den Portnamen setze ich an anderer stelle, der stimmt aber definitiv.

    Bei der Kommunikation sende ich und lese dann die Antwort mit ReadByte, das ja synchron ließt. Ich lese also erst, wenn auch was da ist (oder ein timeout ansteht, dann starte ich von vorne). Kommuniziere also halb duplex. Vor jedem senden und empfangen warte ich auch auf die cts leitung!

    Ich habe mittlerweile die Vermutung, dass es mit dem Treiber von FTDI zusammenhängt. Habe die Version 2.0.0.0. Die neue Version von der FTDI homepage läßt sich nicht installieren.



  • Am seriellen Port kommen die Daten pö a pö an. Das Received Event feuert aber bereits beim ersten angekommen Zeichen (kann man auch anders einstellen, machst Du hier aber nicht). Wenn Du dann die Daten liest kann es passieren, dass Du schneller mit dem lesen fertig bist als bis alle Daten angekommen sind. Du musst also warten bis Du alle Zeichen bekommen hast, oder nach dem Lesen (und einer kurzen Zeitspanne) überprüfen ob Du alle Zeichen aus dem Puffer geholt hast. Synchron / Asynchron ist hier irrelevant.



  • Das verstehe ich aber anders. Die Methode ReadByte ist synchron und ließt genau ein Byte, wenn etwas empfangen wurde. Das ist unabhängig vom Event so wie ich das verstehe. Bei der Read Methode kann man überprüfen, wieviele Bytes tatsächlich gelesen wurden. Da ist es unabhängig davon, was man angibt!

    Ich bin mittlerweile auch der festen Überzeugung, dass das Problem an dem FTDI Treiber liegt. Nach eine Neuinstallation geht es erheblich besser. Zwar nicht perfekt, aber es geht.



  • Richtig es wird ein Byte gelesen, wenn eines da ist. Das Event wird aber nicht bei jedem neuen Byte gefeuert (soweit ich weiss wird so lange gewartet bis serialPort.TimeOut abgelaufen ist, wenn dann neue Zeichen kommen wird wieder gefeuert). Probier's einfach mal aus, Du stocherst eh nur um Nebel rum, also was verlierste?



  • Ich habe vor der Anwendung von ReadByte mit Hilfe von Read die genaue Zeichenanzahl gelesen. War letztendlich dasselbe Problem, darum bin ich dann zu ReadByte gewechselt.

    Bisher läuft aber alles seit der Treiberneuinstallation.


Anmelden zum Antworten