Programm funktioniert beim 2. Ausführen nicht mehr

  • VB.NET

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

    Programm funktioniert beim 2. Ausführen nicht mehr

    Hallo,

    habe ein Programm geschrieben, mit dem ich ein Pyrometer(Temperaturmessgerät) auslesen will.
    Bei Click auf den Butten Temperatur wird dem Messgerät ein Byte
    geschickt und das Messgerät sendet Bytes (die Temperatur) zurück.
    Der Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Function ByteToHex(ByVal comByte As Byte()) As String
    3. Dim builder As New StringBuilder(comByte.Length * 3)
    4. For Each data As Byte In comByte
    5. builder.Append(Convert.ToString(data, 16).PadLeft(2, "0"c)) _
    6. '.PadRight(3, " "c))
    7. Next
    8. Return builder.ToString().ToUpper()
    9. End Function
    10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
    11. System.EventArgs) Handles Button1.Click
    12. SerialPort1.Open()
    13. Dim bufferSenden() As Byte = {&H1}
    14. SerialPort1.Write(bufferSenden, 0, bufferSenden.Length)
    15. Dim bytes As Integer = SerialPort1.BytesToRead
    16. Dim comBuffer As Byte() = New Byte(bytes - 1) {}
    17. SerialPort1.Read(comBuffer, 0, bytes)
    18. Threading.Thread.Sleep(60)
    19. Dim Final As String
    20. Final = ByteToHex(comBuffer)
    21. Label1.Text = Final
    22. SerialPort1.Close()
    23. End Sub
    24. End Class

    Beim ersten Klick funktioniert alles super und ich erhalte die Temperatur als Hex-String.

    Beim 2. Klick jedoch kommt nichts an, der Buffer wo die eingehenden Bytes gespeichert werden ist leer.

    Wenn ich das Programm schliesse und wieder ausführe läuft es beim ersten Klick wieder normal und beim 2. wieder nicht.

    Hat jemand eine Idee wo das Problem liegen könnte?????

    Gruß
    Wenn ich auf den Button Klicke öffne ich ja den SerialPort, sende und lese ich die Daten ein und dann schließe
    ich ihn ja wieder.
    Der SerialPort müsste somit ja bei jedem Klick auf den Button geöffnet und dann wieder geschlossen werden.
    Um ehrlich zu sein verstehe ich nicht was ihr mit Programmstart und Programmende meint.
    Das Öffnen und schließen muss doch durch ein Event hervorgerufen werden.
    Und in meinem Code mache ich das bei Event Button1_Click.

    Wie würde es denn beim Programmstart und Programmende aussehen?? ?(

    VB.NET-Quellcode

    1. Private Sub form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load ' ("Programm start", wenn es dein Startformular ist).
    2. Private Sub form_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed 'oder
    3. Private Sub form_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing '(Programm ende, kommt aber auf deine Einstellung diesbezüglich an).
    4. End Sub
    Habe es gerade versucht.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. SerialPort1.Open()
    3. End Sub
    4. Private Sub form_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    5. SerialPort1.Close()
    6. End Sub


    Aber es hat sich nichts verändert. Beim ersten Klick funktioniert es und dann nicht mehr. (Hätte mich auch gewundert :huh: )

    Jemand eine andere Idee?????????

    Marko12345 schrieb:

    Jemand eine andere Idee?
    Probier mal dies:
    Serial

    VB.NET-Quellcode

    1. Imports System.Text
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim bufferSenden() As Byte = {&H1}
    5. SerialPort1.Write(bufferSenden, 0, bufferSenden.Length)
    6. End Sub
    7. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    8. Dim bytes As Integer = SerialPort1.BytesToRead
    9. Dim comBuffer() As Byte = New Byte(bytes - 1) {}
    10. SerialPort1.Read(comBuffer, 0, bytes)
    11. Me.Invoke(Sub() ShowBytes(comBuffer))
    12. End Sub
    13. Private Sub ShowBytes(comByte() As Byte)
    14. Dim builder As New StringBuilder(comByte.Length * 3)
    15. For Each data As Byte In comByte
    16. builder.Append(Convert.ToString(data, 16).PadLeft(2, "0"c))
    17. Next
    18. Label1.Text = builder.ToString
    19. End Sub
    20. End Class
    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!
    Hallo,

    danke an alle für die schnellen Antworten.
    Habe das Problem gefunden und gelöst.

    Zur Info falls es jemanden interessiert:
    Das Thread.Sleep() war an der falschen Stelle, es musste direkt nach dem Senden der Bytes erfolgen
    und nicht nach dem Lesen.(Manchmal sieht man den Baum vor lauter Wälder nicht :huh: )
    Zudem habe ich die Anzahl der Bytes die ich einlese fest vorgegeben.

    Gruß

    Marko12345 schrieb:

    Das Thread.Sleep() war an der falschen Stelle
    Da machst Du was falsch, dess es ist kein Sleep() erforderlich.
    Hast Du meinen Code mal ausprobiert?
    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!
    Hallo,

    @RodFromGermany:

    Also ich bin leider wie öfters erwähnt kein VB-Experte aber meine Lösung des Problems funktioniert einwandfrei und macht genau das was ich wollte. Das Thread.Sleep() hat einen sehr wichtige Funktion im Code, nämlich:

    Wenn der Code schnell wieder holt wird, dann müssen die gesendeten Bytes, also die Befehle, durch das Thread.Sleep() getrennt werden, da das Gerät auf der anderen Seite sonst nicht weiss wo ein Befehl aufhört und der andere anfängt.(Abhängig von der Baudrate usw.)
    Von daher habe ich wahrscheinlich alles richtig gemacht.

    Deinen Code habe ich auch versucht, der funktioniert auch beim ersten mal aber ab dem 2. Klick stimmen sie Hexwerte und somit die empfangenen Bytes nicht mehr.

    Wie gesagt bin Neu und VB ist in diesem Fall einfach ein Mittel zum Zweck :wacko:

    Gruß

    Marko12345 schrieb:

    da das Gerät auf der anderen Seite sonst nicht weiss wo ein Befehl aufhört und der andere anfängt.
    What?
    Was sind denn das für Befehlssequenzen?
    Das ganze scheint mir doch sehr suboptimal zu sein.
    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!