SerialPort lese probleme

  • VB.NET

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

    SerialPort lese probleme

    Guten Tag,
    ich fange zz mit der Programmierung der Microcontroller an und dazu müsste ich Werte einlesen.
    Einlesen funzt soweit.. aaaaaaaaber, nur in der RichTextBox bzw TextBox und nur iwie als Liste aufgespaltet, ka ich hab mir den Source von Youtube gezogen (hab sonst noch nie damit gearbeitet) und komm jetzt iwie auch nicht mehr mit Basics weiter.

    Was der Code macht:

    VB.NET-Quellcode

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

    er liest brav aus aber wenn ich das als Listbox.items.add(System.Text.Encoding.Default.GetString(Buffer)) haben will, liest er mir nur Teile des Textes aus, warum ist das so? Wie löst man das?
    Bzw auch wie ich den ausgelesenen Wert dann in eine Variable speichern kann?
    Definiere

    H2O schrieb:

    liest er mir nur Teile des Textes aus
    Frage:
    Sendet die Gegenstelle Bytes oder Strings mit einem bestimmten encoding und einem definierten Zeilenende-Zeichen?
    Und sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim ToRead As Integer = SerialPort1.BytesToRead
    3. Dim Buffer(ToRead - 1) As Byte
    4. SerialPort1.Read(Buffer, 0, ToRead)
    5. Dim txt = System.Text.Encoding.Default.GetString(Buffer)
    6. ' Neu empfangene Zeichen an die Empfangspuffer anhängen
    7. Me.Invoke(Sub() RichTextBox1.Text &= txt)
    8. 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:

    Frage:
    Sendet die Gegenstelle Bytes oder Strings mit einem bestimmten encoding und einem definierten Zeilenende-Zeichen?


    ich sende von meinem microcontroller

    C-Quellcode

    1. Serial.print("<entfernung>");
    2. Serial.print(entfernung);
    3. Serial.print("</entfernung>");
    4. Serial.print('\n');


    und lese es über usb mit:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.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 ToRead As Integer = SerialPort1.BytesToRead
    6. If ToRead > 0 Then
    7. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    8. Dim Buffer(ToRead - 1) As Byte
    9. SerialPort1.Read(Buffer, 0, ToRead)
    10. RichTextBox1.Text &= System.Text.Encoding.Default.GetString(Buffer)
    11. RichTextBox1.Focus()
    12. RichTextBox1.Select(RichTextBox1.Text.Length, 0)
    13. End If
    14. End Sub

    auf,.. also String -> zu String, soweit wird auch alles gut in die RichTextBox eingelesen, will aber das "System.Text.Encoding.Default.GetString(Buffer)" als Variable speichern oder mit listbox.items.add hinzufügen.
    Wenn ich es mit Listbox mache, sieht es so aus:




    man sieht, das Zeile 1 richtig ist.. und dann nicht mehr.. warum ist das so? Wie kann ich das lösen?



    EDIT//
    @RodFromGermany
    das von dir ist exakt das gleiche nur alles in einem ;)

    H2O schrieb:

    nur alles in einem
    Jou.
    Wenn Du Texte sendest, empfange auch Texte.
    Gib dem Port das richtige Encoding und Zeilenende:

    VB.NET-Quellcode

    1. SerialPort1.Encoding = System.Text.Encoding.ASCII
    2. SerialPort1.NewLine = Convert.ToChar(10)
    3. ' ...
    4. Dim txt = SerialPort1.ReadLine
    5. Me .Invoke(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!
    Ahhh, hört sich eig logisch an :D
    Danke! :thumbup: Was bedeuten die "10" im ToChar(10)?


    Habs zwischenzeitlich auch noch so hinbekommen.. is aber eher ne 50 50% Lösung^^

    VB.NET-Quellcode

    1. Threading.Thread.Sleep(50)
    2. Dim Buffer(SerialPort1.BytesToRead - 1) As Byte
    3. SerialPort1.Read(Buffer, 0, SerialPort1.BytesToRead)
    4. Dim txt = System.Text.Encoding.Default.GetString(Buffer)
    5. Me.Invoke(Sub() Label1.Text = txt)
    6. Buffer = Nothing


    ich benutz jetzt mal lieber RodFromGermany Methode ^^

    H2O schrieb:

    "10" im ToChar(10)?
    ==> "\n" "\r"
    ---
    Sorry, mach da ne 13 dtaus.
    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!