Serielle COM Daten auswerten?

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von grisu74.

    grisu74 schrieb:

    gesplittet
    kann ich nicht nachvollziehen.
    Da das SerialPort in jedem Falle in einem anderen Thread läuft, stell bitte Deinen Code auf diesen um:

    VB.NET-Quellcode

    1. Private Delegate Sub SetTextCallback(txt As String)
    2. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    3. Dim txt = SerialPort1.ReadLine()
    4. Dim x As New SetTextCallback(AddressOf ReceivedText)
    5. Me.BeginInvoke(x, New Object() {Text})
    6. End Sub
    7. Private Sub ReceivedText(ByVal text As String)
    8. Me.RichTextBox2.Text &= text 'append text
    9. Debug.WriteLine(text)
    10. 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!
    Hallo.

    VB.NET-Quellcode

    1. +CTSDSR: 141,262100105560571,1,262100103102049,1,16
    2. Der Thread 0x2988 hat mit Code 0 (0x0) geendet.
    3. Der Thread 0x2594 hat mit Code 0 (0x0) geendet.
    4. Der Thread 0x954 hat mit Code 0 (0x0) geendet.
    5. Der Thread 0x4878 hat mit Code 0 (0x0) geendet.


    Ich habe den Code abgeändert.
    Mit ReadLine habe ich obriges Ergebniss.
    Mit ReadExisting bekomme ich unteres Ergebniss.

    VB.NET-Quellcode

    1. +CTSDSR: 141,262100105560571,1,
    2. 262100103102049,1,16
    3. 8004
    4. Der Thread 0x456c hat mit Code 0 (0x0) geendet.
    5. Der Thread 0x2040 hat mit Code 0 (0x0) geendet.
    6. Der Thread 0x1728 hat mit Code 0 (0x0) geendet.


    Komischerweise wird bei ReadExisting die Ritchbox korrekt gefüllt.
    Me.RichTextBox2.Text &= text funktioniert.
    Leider funktioniert Debug.WriteLine(text) schon nicht mehr.

    grisu74 schrieb:

    Leider funktioniert ​Debug.WriteLine(text) schon nicht mehr.
    Wie äußert sich das?

    grisu74 schrieb:

    8004
    ist der Unterschied beider Strings.
    Kann es sein, dass zwischen beiden ein CRLF gesendet wird?
    Probier mal, so den Empfangsbuffer leer zu lesen:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. While SerialPort1.BytesToRead > 0
    3. Dim txt = SerialPort1.ReadLine()
    4. Dim x As New SetTextCallback(AddressOf ReceivedText)
    5. Me.BeginInvoke(x, New Object() {Text})
    6. End While
    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!

    Eierlein schrieb:

    Hast du
    Post #8 gelesen?
    Eigentlich sind wir hier in diesem Thread schon fast wesentlich weiter, jedoch nur fast. :/
    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.

    Der Befehl kommt aus einem Digitalfunkgerät.
    Das wird oder soll an die Schnittstelle ausgegeben werden.
    vbCrLf & "+CTSDSR: 141,262100105560571,1,262100103102049,1,16" & vbCrLf & "8003" & vbCrLf
    Ach und ob 8003 oder 8004 ist egal. Das ist nur ein HexCode der sich jenach Ausgabe ändert.
    Das sind übrigens AT-Befehle wenns interresiert.

    Das hier ist die Ausgabe im Ausgabefenster von VisualStudio.

    VB.NET-Quellcode

    1. +CTSDSR: 141,262100105560571,1,
    2. 262100103102049,1,16
    3. 8004
    4. Der Thread 0x456c hat mit Code 0 (0x0) geendet.
    5. Der Thread 0x2040 hat mit Code 0 (0x0) geendet.
    6. Der Thread 0x1728 hat mit Code 0 (0x0) geendet.

    Beim Debuggen sieht mann genau, das Me.RichTextBox2.Text &= text Hier die Variable text noch den gesammten String enthält.
    Aber Debug.WriteLine(text) hier nicht mehr???
    Da werden 3 Ausgaben daraus.?

    Ich kann den String nicht an eine Sub oder Function weitergeben, da er komischerweise halbiert oder in 3 Teile zerlegt wird.

    Gruß Udo

    grisu74 schrieb:

    komischerweise
    enthält der String zwei

    grisu74 schrieb:

    vbCrLf
    Das korrekt parametrierte ReadLine würde also diesen String

    grisu74 schrieb:

    Quellcode

    1. +CTSDSR: 141,262100105560571,1,
    2. 262100103102049,1,16
    3. 8004
    in 3 Operationen auslesen, es ist also alles in Ordnung.

    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.

    Dein Code funktioniert jetzt. :D

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. While SerialPort1.BytesToRead > 0
    3. Dim txt = SerialPort1.ReadLine()
    4. Dim x As New SetTextCallback(AddressOf ReceivedText)
    5. Me.BeginInvoke(x, New Object() {txt})
    6. End While
    7. End Sub


    Nur ein Problem habe ich noch.
    Es kommt kein Ende des Befehls. Da im Befehl vbCrLf vorhanden ist.

    Wie könnte ich das lösen?

    Gruß

    grisu74 schrieb:

    kein Ende des Befehls
    Was meinst Du damit?
    Dieser Code sollte alle 3 Zeilen nacheinander auslesen und zur Auswertung übergeben.
    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!

    grisu74 schrieb:

    aber
    das ist doch konkret richtig.
    Mach Dir eine separate Klasse, die die empfangenen Strings auswertet.
    Da baust Du Dir einen Zähler rein, damit Du stets weißt, welche Antwort die nächste ist.
    Sind alle zusammengehörigen 3 Antworten da, sendewt Du ein Event an das Hauptfenster.
    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!