RS 232 Text Codierung

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    RS 232 Text Codierung

    Hallo Forum

    Ich habe ein Problem wo ich nicht weiter kommen

    Die Verbindung zur Schnittstelle wird Hergestellt und ich bekomme auch eine Antwort.
    Nur leider ist das Ergebnis nicht das was ich brauche.

    Hier mal der Code:

    Quellcode

    1. Imports Microsoft.VisualBasic
    2. Imports System
    3. Imports System.Collections
    4. Imports System.Collections.Generic
    5. Imports System.Data
    6. Imports System.Diagnostics
    7. Imports System.Threading
    8. Imports System.IO.Ports
    9. Imports System.Text
    10. Public Class Form1
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. Button2.Enabled = True
    13. Dim comopen As Boolean
    14. With SerialPort1
    15. .PortName = ComboBox2.SelectedItem.ToString
    16. .ParityReplace = 59 '59
    17. .BaudRate =38400
    18. .Parity = System.IO.Ports.Parity.None
    19. .DataBits = 8
    20. .StopBits = System.IO.Ports.StopBits.One
    21. .Handshake = System.IO.Ports.Handshake.None
    22. .RtsEnable = False
    23. .ReceivedBytesThreshold = 1
    24. .ReadTimeout = 10000
    25. .NewLine = Constants.vbCr
    26. 'Ganz Wichtig!!!
    27. .DtrEnable = False
    28. .Encoding = System.Text.Encoding.GetEncoding("US")
    29. Try
    30. SerialPort1.Open()
    31. comopen = SerialPort1.IsOpen
    32.  
    33. Catch ex As Exception
    34. comopen = False
    35. MsgBox("Fehler beim Öffnen des Ports: " & ex.Message)
    36. Button2.Enabled = False
    37. End Try
    38. End With
    39. If SerialPort1.IsOpen Then
    40. Label1.Text = "Verbunden mit " & SerialPort1.PortName
    41. Button3.BackColor = Color.Green
    42. ComboBox2.Enabled = False
    43. Button5.Visible = True
    44.  
    45.  
    46. Else
    47. Label1.Text = "Keine Verbindung"
    48. Button3.BackColor = Color.Red
    49. Button2.Enabled = False
    50. End If
    51.  
    52. End Sub
    53. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    54. Label1.Text = ""
    55. Label1.Text = "Nicht Verbunden"
    56. Button5.Visible = False
    57. Button2.Enabled = False
    58. Button3.BackColor = Color.Red
    59. ComboBox1.SelectedIndex = 0
    60. Button5.Visible = False
    61. For Each sp As String In My.Computer.Ports.SerialPortNames 'ruft die Verfügbaren Ports ab
    62. ComboBox2.Items.Add(sp)
    63. Next
    64. ComboBox2.SelectedIndex = 0
    65. End Sub
    66. Private Sub Form1_close(Sender As Object, e As EventArgs) Handles MyBase.FormClosing
    67. SerialPort1.Close()
    68. End Sub
    69. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    70. Me.Invoke(Sub() abc(SerialPort1.ReadExisting))
    71. End Sub
    72. Private Sub abc(inputdata As String)
    73. 'TextBox2.AppendText(inputdata & Environment.NewLine)
    74. ListBox1.Items.Add(inputdata)
    75. End Sub
    76. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    77. SerialPort1.Close()
    78. Label1.Text = "Nicht Verbunden"
    79. Button3.BackColor = Color.Red
    80. Button5.Visible = False
    81. End Sub
    82. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    83. End Sub
    84. End Class


    Mit Divice Monitoring Studio bekomme ich die Werte wie Sie brauche. Ich habe mal ein Bild angehängt. Ich glaube dass es nur eine Kleinigkeit ist, komme aber einfach nicht weiter und langsam nervts das ich bei so einer kleinigkeit hänge.
    Also bitte um Hilfe!!!

    Lg Stefan
    Bilder
    • RS232auswertung.jpg

      99,27 kB, 913×381, 126 mal angesehen

    StefanS0 schrieb:

    VB.NET-Quellcode

    1. .Encoding = System.Text.Encoding.GetEncoding("US")
    machst Du

    VB.NET-Quellcode

    1. .Encoding = System.Text.Encoding.GetEncoding("en-US")
    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!

    StefanS0 schrieb:

    Erfolg
    Ich denke, das ist lediglich ein Formatierungsproblem.
    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!

    StefanS0 schrieb:

    Nur weiß ich nicht wo.
    Kannst Du mal vom SerialPort die Information als Byte auslesen und diese dann binär in eine Datei schreiben und diese Datei anhängen?

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim count = SerialPort1.BytesToRead
    3. Dim buffer() As Byte
    4. ReDim buffer(count - 1)
    5. SerialPort1.Read(buffer, 0, count)
    6. IO.File.WriteAllBytes("DEIN_PFAD", buffer)
    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!
    Ich kenne ähnliches noch von meinen Spielereien mit dem Arduino (Leonardo und UNO).
    Mit dem wird auch via (via USB simulierten) SerialPort kommuniziert.

    Solche abgehakten Zeilen, die in der naechsten Zeile weiter liefen, traten bei mir immer dann auf, wenn der Puffer voll lief.

    Edit (nach Durchforstung altem Codes):
    Wenn ich mir sicher war, das am Ende einer Zeile immer ein CrLf (oder \n) kommt, nahm ich auch immer SerialPort1.ReadLine()
    Soweit ich mich erinnere, kann da auch der Puffer "ueberlaufen" ... ReadLine() wartet bis zum naechsten NewLine/CrLf bis es seine Sammlung abschliesst.

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

    Hallo

    Danke mal für eure Hilfe.
    Ich habe jetzt beides ausprobiert.

    1. Bei ROD's Vorschlag wird die Empfangen Daten richtig in die Txt Datei gespeichert, immer nur die letzte empfange Zeile.
    2. Bei Hirnwundes Vorschlag hängt sich das Programm nach 5 Befehlen auf. ?(

    Mittlerweile glaub ich auch das es was mit dem Buffer zu tun hat.
    Lg

    StefanS0 schrieb:

    immer nur die letzte empfange Zeile.
    Klar.
    Die Datei wird ja bei jedem Empfang überschrieben.
    Mach das so, da werden die neuen Daten angehängt:

    VB.NET-Quellcode

    1. Using sw = New IO.StreamWriter("c:\temp\binTest.bin", True)
    2. Dim bw = New IO.BinaryWriter(sw.BaseStream)
    3. bw.Write(buffer, 0, buffer.Length)
    4. End Using
    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

    Ja, funktioniert soweit sehr gut. Danke

    Blöde Frage: Wie bring ich das ganze jetzt noch, bei meiner Form in die Listbox ?? Also nicht vorab in eine TextBox sondern gleich in die Listbox.

    Lg

    StefanS0 schrieb:

    gleich in die Listbox
    geht so:

    VB.NET-Quellcode

    1. Me.ListBox1.Items.Add("bla") ' Dein Text halt
    Im DataReceived dann so:

    VB.NET-Quellcode

    1. Dim txt = "bla"
    2. Me.BeginInvoke(Sub() Me.ListBox1.Items.Add(txt))

    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!