Programm für COM-Auswertung

  • VB.NET

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

    Programm für COM-Auswertung

    Hallo zusammen,

    ich habe eine Hardware per RS232 angeschlossen. Dieses Gerät schickt mir einen Datenstring. Diesen möchte ich in eine Variable reinschreiben.

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Imports MySql
    3. Imports MySql.Data
    4. Imports MySql.Data.MySqlClient
    5. Public Class Form1
    6. Dim con As New MySqlConnection
    7. Dim cmd As New MySqlCommand
    8. Public inputData As String = ""
    9. Public Event DataReceived As IO.Ports.SerialDataReceivedEventHandler
    10. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    11. 'Einstellungen Serieller Port Melder
    12. SerialPort1.PortName = "COM2"
    13. SerialPort1.BaudRate = 9600
    14. SerialPort1.Parity = IO.Ports.Parity.None
    15. SerialPort1.DataBits = 8
    16. SerialPort1.StopBits = IO.Ports.StopBits.One
    17. SerialPort1.Handshake = IO.Ports.Handshake.None
    18. SerialPort1.RtsEnable = True
    19. 'Seriellen Port öffnen
    20. SerialPort1.Open()
    21. End Sub
    22. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    23. 'Try
    24. inputData = SerialPort1.ReadLine 'SerialPort1.ReadExisting '//oder SerialPort1.ReadLine
    25. Me.Invoke(New EventHandler(AddressOf DoUpdate))
    26. 'Catch ex As Exception
    27. 'End Try
    28. End Sub
    29. Public Sub DoUpdate()
    30. label1.text = inputData
    31. End Sub


    Leider kommt in der Variablen nichts an. Wo liegt der Fehler? Kann mir jemand einen Tipp geben?

    Gruß

    Axel schrieb:

    Kann mir jemand einen Tipp geben?
    Probieer mal dies:
    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. Return
    4. End Sub
    5. Private Sub ReceiveText()
    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. TextBox1.Text &= System.Text.Encoding.Default.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!

    RodFromGermany schrieb:

    Axel schrieb:

    Kann mir jemand einen Tipp geben?
    Probieer mal dies:
    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. Return
    4. End Sub
    5. Private Sub ReceiveText()
    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. TextBox1.Text &= System.Text.Encoding.Default.GetString(Buffer)
    12. End If
    13. End Sub

    Hallo,

    danke für die Antwort. Das klappt so halb ;)

    Leider wird der Datenstring nach der Hälfte abgeschnitten. Woran liegt das?





    Bei der Lösung die ich oben gepostet habe, bekomme ich die Meldung:

    "Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen"

    Was kann ich mir darunter vorstellen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Axel“ ()

    Axel schrieb:

    Leider wird der Datenstring nach der Hälfte abgeschnitten.
    Wie lang ist dieser Datenstring?
    Wie groß ist Dein ReadBufferSize (Designer-Einstellung von SerialPort1)?
    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!
    Kann es sein, dass Du versehentlich die Verbindung schließt, bevor die Übertragung beendet ist?
    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!

    Axel schrieb:

    Bringt es was, den Buffer zu erhöhen?
    Nein, der ist groß genug.
    Wie oft werden denn diese Daten gesendet?
    Kannst Du evtl. mal Deinen ganzen Code posten?
    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!
    Die Daten werden im Abstand von mehreren Stunden gesendet.

    Mein Code:

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Imports MySql
    3. Imports MySql.Data
    4. Imports MySql.Data.MySqlClient
    5. Public Class Form1
    6. Dim con As New MySqlConnection
    7. Dim cmd As New MySqlCommand
    8. Public inputData As String = ""
    9. Public Event DataReceived As IO.Ports.SerialDataReceivedEventHandler
    10. Private Sub Datenbank()
    11. con.ConnectionString = My.Settings.auswertungConnectionString
    12. cmd.Connection = con
    13. End Sub
    14. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    15. 'Einstellungen Serieller Port Melder
    16. SerialPort1.PortName = "COM3"
    17. SerialPort1.BaudRate = 9600
    18. SerialPort1.Parity = IO.Ports.Parity.None
    19. SerialPort1.DataBits = 8
    20. SerialPort1.StopBits = IO.Ports.StopBits.One
    21. SerialPort1.Handshake = IO.Ports.Handshake.None
    22. SerialPort1.RtsEnable = True
    23. 'Seriellen Port öffnen
    24. Try
    25. SerialPort1.Open()
    26. Catch ex As Exception
    27. End Try
    28. End Sub
    29. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    30. 'Try
    31. 'inputData = SerialPort1.ReadLine 'SerialPort1.ReadExisting '//oder SerialPort1.ReadLine
    32. 'Me.Invoke(New EventHandler(AddressOf DoUpdate))
    33. 'Catch ex As Exception
    34. 'End Try
    35. Me.Invoke(Sub() ReceiveText())
    36. Return
    37. End Sub
    38. Private Sub ReceiveText()
    39. Dim ToRead As Integer = SerialPort1.BytesToRead
    40. If ToRead > 0 Then
    41. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    42. Dim Buffer(ToRead - 1) As Byte
    43. SerialPort1.Read(Buffer, 0, ToRead)
    44. Label1.text &= System.Text.Encoding.Default.GetString(Buffer)
    45. End If
    46. End Sub
    Sieht eigentlich gut aus.
    Bist Du sicher, dass SerialPort1.RtsEnable = True hier richtig ist?
    Setz das mal versuchsweise auf False.
    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!
    Bei welcher Code-Zeile kommt die Fehlermeldung?
    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!
    Lösch diese Zeile!
    Sie kommt in dem von Dir geposteten Code sowie in meinem Beispiel nicht vor :!:
    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!
    Ich denke mal, es kommen nur 27 Zeichen.
    Bei meinem Code kommen die an und gut.
    Bei Deinem Code wartet er auf <CR><LF> oder so und bricht nach TimeOut ab.
    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!
    Hast Du ein Monitor-Programm, mit dem Du das Port überwachen kannst?
    Dann mach mal das Kabel ab und wieder dran, sorgfältig festschrauben, und sieh Dir noch mal genau an, wie die Propertries des SerialPort eingestellt werden müssen, vergleiche sie alle einzeln.
    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!