Empfangene Serial Port Daten in verschiedene Lables augeben

  • VB.NET

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

    Empfangene Serial Port Daten in verschiedene Lables augeben

    Ich möchte ein kleines tool zum auslesen von einem Serial Port mit vb erstellen.
    jedoch habe ich ein Problem beim auslesen der strings.
    mein String sieht so aus:
    $APR:1#$AOT:349#$MEB:10#$MBV:0#$WME:0#$MEW:2868904939#$STW:50429304#$MES:100#
    Wie splite ich den string in verschidene Lables?
    Beispiel:
    $MES:100#
    $=anfang
    MES:= bezeichnung
    100= der wert der in einem lable ausgegeben werden soll
    #=ende
    Mein Code

    VB.NET-Quellcode

    1. Private Sub ReceivedText(ByVal [text] As String)
    2. Dim characters() As Char = {"a"c, "b"c, "c"c, "d"c}
    3. Dim alphabet As New String(characters)
    4. 'compares the ID of the creating Thread to the ID of the calling Thread
    5. If Me.RichTextBox2.InvokeRequired Then
    6. Dim x As New SetTextCallback(AddressOf ReceivedText)
    7. Me.Invoke(x, New Object() {(text)})
    8. Else
    9. Me.Label3.Text = [text]


    ;(

    CodeTag eingefügt. Nächstes Mal bitte selbst daran denken! ~Thunderbolt

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

    cappy80 schrieb:

    mein String sieht so aus:
    Wenn Du dem Port sagst, dass "#"Dein Zeilenende ist, bekommst Du jedes Schnipsel Deiner Daten einzeln als Zeile geliefert:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. SerialPort1.NewLine = "#"
    3. End Sub
    4. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    5. Dim line = SerialPort1.ReadLine()
    6. ' was mit line tun
    7. 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!

    cappy80 schrieb:

    in ein Label
    Strings, keine Zahlen, ansonsten musst Du sie noch konvertieren. Wenn Du das SerialPort wie oben gezeigt konfiguriert hast, dann so:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim txt = SerialPort1.ReadLine
    3. ' das SerialPort arbeitet in einem anderen Thread, deswegen muss die Ausgabe invoked werden.
    4. Me.BeginInvoke(Sub() Ausgabe(txt))
    5. End Sub
    6. Private Sub Ausgabe(txt As String)
    7. Dim parts() = txt.Split(New Char() {"$"c, ":"c}, System.StringSplitOptions.RemoveEmptyEntries)
    8. Dim value As String = parts(1)
    9. Select Case parts(0)
    10. Case "APR"
    11. Label1.Text = value
    12. Case "AOT"
    13. Label2.Text = value
    14. Case "MEB"
    15. Label3.Text = value
    16. Case "MBV"
    17. Label4.Text = value
    18. End Select
    19. 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!
    Hat super funktioniert Danke

    Habe aber bemerkt das beim auslesen teile verloren gehen oder nur langsam angezeigt werden.
    wo kann der Fehler sein?


    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Threading
    3. Imports System.IO.Ports
    4. Imports System.ComponentModel
    5. Imports System.Collections.Generic
    6. Imports System.Data
    7. Imports System.Drawing
    8. Imports System.Linq
    9. Imports System.Text
    10. Imports System.Windows.Forms
    11. Imports System.Text.RegularExpressions
    12. Public Class Form1
    13. Dim SerialPort As Object()
    14. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    15. SerialPort1.NewLine = "#"
    16. serialport = IO.Ports.SerialPort.GetPortNames()
    17. ComboBox1.Items.AddRange(SerialPort)
    18. End Sub
    19. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    20. Dim txt = SerialPort1.ReadLine
    21. 'das SerialPort arbeitet in einem anderen Thread, deswegen muss die Ausgabe invoked werden.
    22. Me.BeginInvoke(Sub() Ausgabe(txt))
    23. End Sub
    24. Private Sub Ausgabe(txt As String)
    25. Dim parts() = txt.Split(New Char() {"$"c, ":"c}, System.StringSplitOptions.RemoveEmptyEntries)
    26. Dim value As String = parts(1)
    27. Select Case parts(0)
    28. Case "APR"
    29. Label3.Text = value
    30. Case "AOT"
    31. Label4.Text = value
    32. Case "MEB"
    33. Label5.Text = value
    34. Case "MBV"
    35. Label6.Text = value
    36. Case "WME"
    37. Label7.Text = value
    38. Case "MEW"
    39. Label8.Text = value
    40. Case "STW"
    41. Label9.Text = value
    42. Case "MES"
    43. Label10.Text = value
    44. End Select
    45. End Sub
    46. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    47. Me.RichTextBox1.Text = String.Empty
    48. If Me.ComboBox1.Text = String.Empty Then
    49. Me.RichTextBox1.Text = "Please Select Port Settings"
    50. Else
    51. Try
    52. ' make sure port isn't open
    53. If Not Me.SerialPort1.IsOpen Then
    54. Me.SerialPort1.PortName = Me.ComboBox1.Text
    55. 'this->textBox1->Text=this->comboBox1->Text;
    56. Me.SerialPort1.BaudRate = 57600
    57. 'this->textBox1->Text=this->comboBox2->Text;
    58. Me.RichTextBox2.Text = ""
    59. 'open serial port
    60. Me.SerialPort1.Open()
    61. Me.ProgressBar1.Value = 100
    62. Else
    63. Me.RichTextBox1.Text = "Port isn't openned"
    64. End If
    65. Catch UnnamedCatchVariable As UnauthorizedAccessException
    66. Me.RichTextBox1.Text = "Port belegt"
    67. End Try
    68. End If
    69. End Sub
    70. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    71. SerialPort1.Close()
    72. Me.ProgressBar1.Value = 0
    73. ' add sender name
    74. Dim name As String = Me.SerialPort1.PortName
    75. ' grab text and store in send buffer
    76. Dim message As String = Me.RichTextBox1.Text
    77. ' write to serial
    78. If Me.SerialPort1.IsOpen Then
    79. 'this->_serialPort->WriteLine(String::Format("<{0}>: {1}",name,message));
    80. Me.SerialPort1.WriteLine(message)
    81. Me.Label3.Text = ""
    82. Me.RichTextBox1.Text = String.Empty
    83. Me.RichTextBox2.Text = String.Empty
    84. Me.Label3.Text = Text.DefaultIfEmpty
    85. Else
    86. Me.RichTextBox2.Text = "Port Not Opened"
    87. End If
    88. End Sub
    89. End Class

    cappy80 schrieb:

    VB.NET-Quellcode

    1. Me.SerialPort1.Open()
    machst Du beim Start der Anwendung,

    cappy80 schrieb:

    VB.NET-Quellcode

    1. SerialPort1.Close()
    bei Beendigung.
    Sonst wäre es möglich, dass Teile gesendet werden, während das Port zu ist.
    Mit Button2 schließt Du das Port und fragst danach, ob es offen 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!

    cappy80 schrieb:

    von etwa 1 Sekunde
    K.A. Ich kann das ohne Hardware leider nicht testen.
    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!