Daten der seriellen Schnittstelle auswerten

  • VB.NET

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

    Daten der seriellen Schnittstelle auswerten

    Hallo,

    ich steh mal wieder voll auf dem Schlauch.
    Ich bekomme über die serielle Schnittselle fortlaufend Datentelegramme.
    Jedes Telegram endet mit einem # Zeichen.

    Da die Telegramme eine unterschiedliche Länge haben möchte ich so lange sammeln bis dieses Zeichen erscheint und dann weiter auswerten.

    Im angehängten Code sollen die Daten in der Textbox10 gesammelt und dann ausgewertet werden.
    Irgent wie mache ich da aber etwas falsch da die Daten völlig durcheinander angezeigt werden



    VB.NET-Quellcode

    1. Private Sub myComPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles myComPort.DataReceived
    2. Dim vari1ende As String
    3. Dim PosStart As Integer
    4. Dim Variablen() As String
    5. Dim PosRaute As Integer
    6. Dim inc As Integer
    7. Dim Datenabschnitt As String
    8. Me.TextBox1.Text = Me.TextBox1.Text & Me.myComPort.ReadExisting ' Textbox1 wird fortlaufen gefüllt
    9. Me.TextBox10.Text = TextBox10.Text & Me.myComPort.ReadExisting ' Textbox10 wird zur Auswertung gefüllt
    10. If Me.TextBox10.Text = ("#"c) Then
    11. vari1ende = Me.TextBox10.Text.IndexOf("#"c) 'Länge Textinhalt feststellen
    12. Me.TextBoxLange.Text = vari1ende 'Länge Textinhalt anzeigen
    13. PosStart = Me.TextBox10.Text.IndexOf("0:") 'Position Startzeichen feststellen
    14. PosRaute = Me.TextBox10.Text.IndexOf("#"c) 'Position Endzeichen feststellen
    15. Datenabschnitt = Me.TextBox10.Text.Substring(PosStart + 2, PosRaute - PosStart - 3) 'Substring(start, length)
    16. Variablen = Split(Datenabschnitt, "-")
    17. For inc = LBound(Variablen) To UBound(Variablen) ' String füllen
    18. xvari(inc) = Variablen(inc)
    19. Next
    20. Me.TextBox2.Text = CStr(xvari(0))
    21. Me.TextBox3.Text = CStr(xvari(1))
    22. Me.TextBox4.Text = CStr(xvari(2))
    23. Me.TextBox5.Text = CStr(xvari(3))
    24. Me.TextBox6.Text = CStr(xvari(4))
    25. Me.TextBox7.Text = CStr(xvari(5))
    26. Me.TextBox8.Text = CStr(xvari(6))
    27. Me.TextBox9.Text = CStr(xvari(7))
    28. Me.TextBox10.Text = ""
    29. End If
    30. End Sub

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

    Hallo,

    danke für deine Hilfe.
    Das hat mir schon ein wenig weitergeholfen.

    Meine Daten werden über einen AVR Controller an die Schnittstelle gesendet.
    I.d.R. kommt immer ein Datensatz an. Allerdings kann die Zeit zum nächsten Datensatz sehr gering sein so dass fast keine Unterbrechung zu erkennen ist.
    Vielleicht kannst du mir noch eine Frage beantworten.
    Wird beim Empfang über die serielle Schnittstelle nicht immer automatisch ein "unsichtbares Zeichen" als Datensatzende mitgesendet?
    Kommt auf das Protokoll an. Manchmal kommt als letztes ein CHR(13) (Wagenrücklauf). Manchmal ein CHR(13)CHR(10) (Wagenrücklauf und Zeilenvorschub).
    Meine (selbstprogrammierten) AVRs senden als letztes immer ein CHR(13) zum PC.

    Ich selbst entferne alle CHR(10) (Wenn denn welche kommen) und Splitte dann bei CHR(13) auf. Der Rest bleibt im Puffer und neue Daten werden da wieder angehangen.

    Beispiel gibt es nicht, da ich nicht VB.NET progge.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hallo
    Wenn du das Sendeprotokoll selbst in der Hand hast, solltest du erst einmal die EinzelZeichen mit kleinen Pausen senden.
    Dein Vb Prog testet jedes Zeichen sofort nach Eingang,das brauch auch etwas Zeit.

    Ich habe auch mit guten Erfolg immer eine Konstante Länge von Zeichen gesendet.
    Wenn weniger Daten dann Dummi Bytes.
    Hängst du dann Trotzdem ein Endezeichen daran,kannst du nochmals dadurch feststellen das die Daten
    alle angekommen sind.
    Es gibt viele Wege,mit Verzögerung ist es aber am sichersten,wenn nicht mit Prüfsumme gearbeitet wird.
    Gruß