Probleme mit RS232 und VB

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Armin77.

    Probleme mit RS232 und VB

    Hallo allerseits,

    Ich erfasse mit einem AVR 4 verschiedene Meßwerte und bilde einen String daraus:
    Wert1:Wert2:Wert3:Wert4.
    Dann sende ich ihn per RS232 an das VB Programm das den String aufsplittet und
    mir die einzellnen Werte ausgibt.
    Das klappt auch.
    Das Problem ist, daß beim ersten und ca. alle 5-6 Meßwerte Blödsinn empfangen wird und
    ich einen Fehler angezeigt bekomme.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Property Data As String
    3. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    4. End Sub
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. Timer1.Enabled = True
    7. End Sub
    8. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    9. If SerialPort1.IsOpen = True Then
    10. SerialPort1.Close()
    11. End If
    12. End Sub
    13. Private Function Split() As String()
    14. Throw New NotImplementedException
    15. End Function
    16. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    17. Dim wert As String
    18. Try
    19. wert = ""
    20. SerialPort1.PortName = TextBox1.Text
    21. SerialPort1.BaudRate = TextBox2.Text
    22. SerialPort1.Open()
    23. SerialPort1.DiscardInBuffer()
    24. wert = SerialPort1.ReadTo(vbCrLf)
    25. SerialPort1.Close()
    26. TextBox3.Text = wert
    27. Dim befehl As String() = wert.Split(":")
    28. TextBox4.Text = befehl(0)
    29. TextBox5.Text = befehl(1)
    30. TextBox6.Text = befehl(2)
    31. TextBox7.Text = befehl(3)
    32. balken1.Value = befehl(0)
    33. balken2.Value = befehl(1)
    34. balken3.Value = befehl(2)
    35. balken4.Value = befehl(3)
    36. Catch ex As Exception
    37. Timer1.Enabled = False
    38. MsgBox("fehler")
    39. End Try
    40. End Sub
    41. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    42. Timer1.Enabled = False
    43. End Sub
    44. End Class


    Hat einer einen Tip für mich?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Willkommen im Forum. :thumbup:
    Schmeiß Deinen Code vollständig weg und fang ein neues Programm an.
    Die Initialisierung des Ports (Baudrate, Stopbit, ...) erfolgt im Designer, das Port öffnest Du in der Form_Load oder in einer Button_Click-Prozedur.
    Das Port hat ein Event, das Dir sagt, wenn Daten vorhanden sind, nutze dies.
    Weil der Port-Interrupt aus einem anderen Thread kommt, nutze Invoke:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Me.Invoke(Sub() ReceiveText())
    3. End Sub
    4. Private Sub ReceiveText()
    5. Dim _Encoding As System.Text.Encoding = System.Text.Encoding.Default
    6. Dim ToRead As Integer = SerialPort1.BytesToRead
    7. If ToRead > 0 Then
    8. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    9. Dim Buffer(ToRead - 1) As Byte
    10. SerialPort1.Read(Buffer, 0, ToRead)
    11. TextBox2.Text &= _Encoding.GetString(Buffer)
    12. End If
    13. 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!
    Hallo,

    klar kann man die Einstellungen im Designer machen.
    Wollte es so machen, daß das andere auch benutzen können,
    die noch weniger Ahnung von VB haben als ich.

    Könntest du mir dein Programm erläutern?
    Mach VB nur Hobbymäßig.
    Bist du sicher das das so geht.
    Der AVR sendet keine Zahl sondern einen String.
    Z.B 345:236:123:789
    Der soll zerlegt und den Textfeldern zugewiesen werden.

    Armin77 schrieb:

    die noch weniger Ahnung von VB haben als ich.
    Solch kannst Du machen, wenn Du es verstanden hast, vorher nicht :!:
    Die serielle Schnittstelle meldet, wenn Daten da sind.
    Oder rennst Du alle 5 Minuten zur Tür um nach dem Boten Ausschau zu halten, wenn Du eine Pizza bestellt hast? Nein, Du wartest, bis der Bote klingelt :!:
    Das mit dem Invoke kriegen wir später, das muss genommen werden, wenn von einem anderen Thread aus auf die GUI zugegriffen werden soll.
    Wir fragen ab, wieviele Zeichen im Empfangsbuffer vorhanden sind und lesen alle aus. Dann werden die Bytes in einen String konvertiert, wir benutzen das im System eingestellte Encoding, das ist erforderlich, um äöüß ordentlich darzustellen.
    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,

    hab es jetzt hinbekommen. Wußte nicht das es ein Ereignis
    für das Eintreffen von Daten an der Seriellen Schnittstelle gibt.
    Habe da noch nicht hingeschaut.
    Das macht die Sache wirklich einfach.
    Das mit Invoke war der entscheidene Tipp.
    Habe im Programm des AVr es so eingestellt das er alle 2 Sekunden
    die Werte bringt.
    Schneller ist das Unsinn.
    Splitte es dann von Hand, wie in meinem ersten Programm.
    Vielen Dank