Buffer Overflow Serialport

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Buffer Overflow Serialport

    Hallo zusammen!

    Ich habe ein GUI für meine Fräse programmiert in VB2010. Ich stelle die Frage deshalb hier weil ich mir vorstellen könnte, dass mein Problem entweder beim Backgroundworker oder beim SerialPort liegt.

    Das Problem an sich ist, dass wenn ich den Code an die Fräse streame es manchmal vorkommt, dass Zeilen übersprungen werden, so hat es zumindest den Anschein. Hier erstmal der Code

    VB.NET-Quellcode

    1. Private Sub BWAuto_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BWAuto.DoWork
    2. For Me.i = 0 To CodeBox.Items.Count - 1
    3. If answer.Contains("ok") Then
    4. SerialPort1.WriteLine(CodeBox.Items.Item(i))
    5. answer = SerialPort1.ReadLine()
    6. End If
    7. Me.Invoke(Sub() CurrentCode.Text = CodeBox.Items.Item(i))
    8. Me.Invoke(Sub() CalculatePercent())
    9. Me.Invoke(Sub() InterpretCode())
    10. Me.Invoke(Sub() OpticalSelection())
    11. Me.Invoke(Sub() ProgramTimer.Start())
    12. Me.Invoke(Sub() WriteLog())
    13. Next i
    14. Me.Invoke(Sub() ProgramEnd())
    15. End Sub


    Dieser Code streamt den GCode aus einer Listbox an die Fräse solange bis kein Code mehr übrig ist und hier tritt auch das Problem mit dem Überspringen auf.


    Der folgende Code betrifft die SingleBlock Funktion, hier muss jede Codezeile bestätigt werden, erst dann wird der nächste gesendet.

    VB.NET-Quellcode

    1. Private Sub BWAuto_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BWAuto.DoWork
    2. For Me.i = 0 To CodeBox.Items.Count - 1
    3. If answer.Contains("ok") Then
    4. SerialPort1.WriteLine(CodeBox.Items.Item(i))
    5. answer = SerialPort1.ReadLine()
    6. End If
    7. Me.Invoke(Sub() CurrentCode.Text = CodeBox.Items.Item(i))
    8. Me.Invoke(Sub() CalculatePercent())
    9. Me.Invoke(Sub() InterpretCode())
    10. Me.Invoke(Sub() OpticalSelection())
    11. Me.Invoke(Sub() ProgramTimer.Start())
    12. Me.Invoke(Sub() WriteLog())
    13. MessageBox.Show(CodeBox.Items.Item(i).ToString)
    14. Next i
    15. Me.Invoke(Sub() ProgramEnd())
    16. End Sub


    Beide Codes sind identisch bis auf die MessageBox bei der SingleBlock Funktion, hier tritt der Fehler nie auf.


    Und hier noch die Einstellungen für den SerialPort:
    Name: SerialPort1
    GenerateMember: True
    Modifier: Friend
    BaudRade: 115200
    DataBits: 8
    DiscardNull: False
    DtrEnabled: False
    Handshake: None
    Parity: None
    ParityReplace: 63
    PortName: COM5
    ReadBufferSize: 4096
    ReadTimeout: -1
    ReceivedBytesTreshold: 1
    RtsEnabled: False
    StopBits: One
    WriteBufferSize: 2048
    WriteTimeout: -1


    Ich hoffe jemand kann mir weiterhelfen

    Vielen dank im Voraus
    @dr. Nick Keine Ahnung, was da wo passiert.
    Aber eines musst Du machen:
    Pro Sub genau ein Invoke :!:
    Mach Dir eine zentrale Sub, die Du invokst und der Du den empfangenen String mitgibst, sofern der benötigt wird.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Vor kurzem hatten wir schon Probleme mit SerialPorts:
    Serial Port
    Die SerialPorts sind sehr zickige Dinger, wenn man sie falsch anpackt. Das MultiThreading bei Dir macht es auch nicht wirklich besser. Eine For-Schleife, bei der die Iterationsvariable außerhalb deklariert ist (erkennt man am Me.i) ist sehr komisch. Eine For-Schleife, bei der die Iterationsvariable überhaupt außerhalb der Methode deklariert ist, ist besonders schräg. Und Du greifst innerhalb der DoWork-Methode auf die GUI zu.
    Mach das Senden erst mal mit nur einem Thread und so, wie im verlinkten Thread gezeigt. Mit welchem Encoding die Strings encodiert werden müssen, sollte in der Dokumentation der Fräse stehen. Ich vermute mal ASCII. Sobald die Kommunikation zuverlässig funktioniert kannst Du immer noch Multithreading einbauen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils