0 mit SerialPort empfangen

  • VB.NET

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

    0 mit SerialPort empfangen

    Hallo Community

    Ich habe hier ein Programm, das über eine serielle Schnittstelle mit einem µC kommuniziert. Der µC schickt auf Anfrage Datenpakete. Die Daten kommen direkt als Byte und enthalten alles von 0 - 255.

    Ich lese die Zeichen einzeln nach Empfang mit SerialPort1.ReadByte aus dem Puffer. Funktioniert eigentlich ganz gut, nur wenn der µC eine 0 sendet wird diese von ReadByte übersprungen. Wie kann ich das verhindern?

    MfG Sam

    Nachtrag: Mit fällt gerade auf, wenn eine 127 gesendet wird zeigt es stattdessen 8364 an O.o

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

    Wie sieht denn Dein Code aus?
    Gibt es eine ordentliche Befehls-Beschreibung?
    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!
    So sieht meine Abfrage zurzeit aus. Ich bin damit auch nicht zufrieden, ist ja nicht gerade elegant gelöst, ihr dürft mich da sehr gerne verbessern, vorallem die Schleife passt mir nicht, ist aber gerade meine brauchbarste Lösung und sie funktioniert :)

    Quellcode

    1. SerialPort1.WriteLine(Chr(255) & Chr(0) & Chr(0) & Chr(17))
    2. Do : Loop While SerialPort1.ReadBufferSize < 6
    3. Label.Text = SerialPort1.ReadByte & " - " & SerialPort1.ReadByte & " - " & SerialPort1.ReadByte & " - " & SerialPort1.ReadByte
    4. SerialPort1.DiscardInBuffer()

    DragonSam schrieb:

    Ich bin damit auch nicht zufrieden
    Das glaube ich Dir.
    Das SerialPort generiert ein Event, das sagt, dass Daten angekommen sind.
    Da das SerialPort in einem anderen Thread arbeitet, solltest Du, falls Du was anzeigen willst, mit Invoke arbeiten:
    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 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. TextBox1.Text &= System.Text.Encoding.Default.GetString(Buffer)
    11. End If
    12. 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!
    Ok, ich habe den Code eingearbeitet. Er empfängt zwar (ich lasse es in einer MsgBox ausgeben), es wird aber nichts geschrieben, die MsgBox ist leer.

    Edit: Nein, ich habe nur sehr kleine Werte erhalten, die ja dann in nicht sichtbare Zeichen umgesetzt werden. Wie kann ich die Bytefolge als Dezimalzahlen ausgeben?

    Edit2: Ok, hab's geschafft, jetzt muss ich den Code nur noch an meinen Fall anpassen. Vielen Dank :)

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

    im Byte-Array Buffer liegen die Daten vor, damit kannst Du tun, was immer notwendig 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!