Kann man Comport "Buffer" loschen?

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Kann man Comport "Buffer" loschen?

    Hallo Leute. Und danke fürs reinschauen. Mein Problem:

    mein mc sendet einen char-Wert. ich emfpange ihm alles kein problem.

    jetzt ist es so, dass ab und zu der rechner dem mc nicht nachkommt, und deswegen im buffer schon mehrere char werte stehen, die nicht richtig zugeordnet werden.

    meine Frage: wie kann ich buffer von rs232 löschen?

    mein Code:

    VB.NET-Quellcode

    1. Private Function getInteger(ByVal zustand As Integer) As Integer
    2. comport.Write(Convert.ToChar(zustand))
    3. comport.Write(Convert.ToChar(0))
    4. Dim ToRead As Integer = comport.BytesToRead
    5. If ToRead > 0 Then
    6. If ToRead > 1 Then
    7. comport.Clear()
    8. comport.Write(Convert.ToChar(zustand))
    9. comport.Write(Convert.ToChar(0))
    10. End If
    11. Dim Buffer(ToRead - 1) As Byte
    12. comport.Read(Buffer, 0, ToRead)
    13. Return Buffer(0)
    14. End If
    15. Return 0
    16. End Function


    ungefähr so stell ich mir es vor. das problem ist nur comport.Clear() gibt es nicht. verdammt.


    kennt ihr so eine funktion? er soll einfach den gesammten buffer verwerfen.
    danke dir.

    ich habe das problem jetzt so gelöst, dass ich immer 10 arrays abfrage. bleibt da was stecken, wird es halt abgeholt und beim nächsten mal ist die zuordnung wieder ok.

    weis zwar nicht ob es ganz gut gelöst ist, aber scheint zu funktionieren.

    EugenIS schrieb:

    aber scheint zu funktionieren.

    Fummel fummel ... geht doch?

    Das ganze mit .Write und DIREKT folgendem .Read ist schon der Fehler. Wie kommst du darauf, dass innerhalb von mikrosekunden schon ne Antwort vom Controller da ist? Im Prinzip musst du entweder WARTEN, BIS ein Zeichen als Antwort vorliegt oder per Event das Vorliegen eines Zeichens bearbeiten. Wenn die Antwort i.A. "schnell" kommt (oder gar nicht) wäre "warten" vermutlich ausnahmsweise gar nicht SO schlecht. Also einen Thread/Task, der eine gewisse Zeit in Schleife geht und auf das Eintreffen der Antwort wartet. Und natürlich keine neue Anforderung senden, wenn die alte noch nicht beantwortet wurde - wobei man das auch mit ner Queue(of T) lösen könnte in die man die jeweiligen Anforderungen pützt und dann bei Antwort die jeweils zugehörige "Frage" entfernt.
    In welchem Kontext wird denn Deine getInteger()-Funktion aufgerufen?
    Doch nicht etwa in einem Timer :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    bitte antworte nicht auf alte Threads, außer du hast eine Frage, die explizit in diesem Thema stehen sollte, damit der Sinnzusammenhang gewahrt bleibt. In diesem Fall sind Alternativen zum Posting im Thema ist ein neues Thema, das z.B. durch Links oder Zitate den Bezug herausstellt.

    Thema geschlossen

    Viele Grüße
    ~blaze~