G Code an Fräse senden

  • VB.NET

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

    G Code an Fräse senden

    Hallo zusammen!

    Ich habe einen kleine G Code Sender gebaut um Daten an meine Fräse zu senden. Die Daten werden gesendet und jede Zeile in einer Textbox ausgegeben:

    VB.NET-Quellcode

    1. OpenFileDialog1.ShowDialog()
    2. Dim objReader As New System.IO.StreamReader(OpenFileDialog1.FileName)
    3. Do While objReader.Peek >= 0
    4. Dim str As String = objReader.ReadLine
    5. TextBox1.Text = str
    6. SerialPort1.WriteLine(str)
    7. SerialPort1.ReadLine()
    8. Loop



    Das ganze funktioniert einwandfrei, jedoch suche ich eine bessere Lösung als die hier, denn auch wenn Zeile für Zeile gesendet wird, so ist während dem ganzen Sendeprozess das ganze Programm blockiert, ich kann nicht mal das Fenster selbst bewegen, es wird aber jede Zeile in der TB angezeigt (?). wenn ich das SerialPort1.ReadLine() weglasse wird der gesamte Code auf einmal zur Fräse gesendet und der Buffer der Fräse überlastet > Fräsprogramm hängt, aber das Programm an sich hängt nicht mehr

    Ich hoffe jemand kann mir helfen.

    mfg
    @dr. Nick Pack den relevanten Code in einen separaten Thread, das kann auch ein BackgroundWorker sein.
    Die Textbox musst Du dann allerdings über Invoke befüllen.
    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!
    Dein Tipp mit dem Backgroundworker war goldrichtig Form friert nun nicht mehr ein, aber ich erhalte nun eine Fehlermeldung wenn ich die Zeilen in die TB ausgeben will

    ​Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement TextBox2 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. Dim sLines As String() = TextBox1.Lines
    3. For i As Integer = 0 To sLines.Length - 1
    4. TextBox2.Text = sLines(i)
    5. SerialPort1.WriteLine(sLines(i))
    6. SerialPort1.ReadLine()
    7. Next
    8. End Sub



    Aufruf:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. BackgroundWorker1.RunWorkerAsync()
    3. End Sub


    Hab den Code jetzt geändert sodass direkt aus der TB gelesen wird, wenn ich den Satz mit der TB2 ausblende arbeitet die Fräse einwandfrei

    dr. Nick schrieb:

    Fehlermeldung
    Lesen bildet:

    RodFromGermany schrieb:

    Die Textbox musst Du dann allerdings über Invoke befüllen.

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. Dim sLines As String() = TextBox1.Lines
    3. For i As Integer = 0 To sLines.Length - 1
    4. Dim j As Integer = i ' das will der Compiler so haben.
    5. Me.Invoke(Sub() TextBox1.Text = sLines(j))
    6. SerialPort1.WriteLine(sLines(i))
    7. SerialPort1.ReadLine()
    8. Next
    9. End Sub
    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!
    Super! Danke!

    Wenn ich jetzt aber die Daten lesen möchte die die Fräse zurückgiebt (Position, ...) scheint der Buffer wieder auf anhieb voll zu sein. Um die Daten zu empfangen muss ich ein ? an die Maschine senden. Ich denke mal senden und empfangen wird gleichzeitig nicht möglich sein über USB oder?

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. ReadBuffer = SerialPort1.ReadExisting()
    3. SerialPort1.WriteLine("?")
    4. Me.Invoke(New EventHandler(AddressOf ReadData))
    5. End Sub
    6. Sub ReadData()
    7. Daten.Text = ReadBuffer
    8. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dr. Nick“ ()

    dr. Nick schrieb:

    muss ich ein ? an die Maschine senden
    Pack die Abfrage mal in eine Button_Click, die hat im DataReceived-Event nix zu suchen.
    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!