Wie kann ich das crlf in einem String finden?

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

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von a.b_om.

    Wie kann ich das crlf in einem String finden?

    Liebe Community

    Mein Programm ist fast fertig. :thumbsup:

    Leider fehlt mir noch etwas.

    Wenn ich eine zu Lange Nachricht über die Com-Ports erhalte, splittet es diesen einfach. Wie
    ich das Problem lösen kann, weiss ich. Leider nur nicht wie ich das umsetze. ?(

    Ich muss den String nach dem vbCrLf durchsuchen und falls es einen Treffer hat, sollte es eine Methode ausführen. Es sollte den Text vor den vbCrLf mitgeben.

    Mein jetztiger Code zum Empfangen der Nachrichten:
    Spoiler anzeigen

    Quellcode

    1. Private Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
    2. Try
    3. Me.Invoke(Sub() WriteReceivedData(SerialPort.ReadExisting()))
    4. Catch ex As Exception
    5. End Try
    6. End Sub
    7. Private Sub WriteReceivedData(ByVal input As String)
    8. Dim text As String = txtAusgabe.Text
    9. Try
    10. Dim tag As String
    11. If Convert.ToInt32(Date.Now.Day) < 10 Then
    12. tag = "0" & Convert.ToString(Date.Now.Day)
    13. Else
    14. tag = Convert.ToString(Date.Now.Day)
    15. End If
    16. Dim monat As String
    17. If Convert.ToInt32(Date.Now.Month) < 10 Then
    18. monat = "0" & Convert.ToString(Date.Now.Month)
    19. Else
    20. monat = Convert.ToString(Date.Now.Month)
    21. End If
    22. Dim stunden As String
    23. If Convert.ToInt32(Date.Now.Hour) < 10 Then
    24. stunden = "0" & Convert.ToString(Date.Now.Hour)
    25. Else
    26. stunden = Convert.ToString(Date.Now.Hour)
    27. End If
    28. Dim minuten As String
    29. If Convert.ToInt32(Date.Now.Minute) < 10 Then
    30. minuten = "0" & Convert.ToString(Date.Now.Minute)
    31. Else
    32. minuten = Convert.ToString(Date.Now.Minute)
    33. End If
    34. Dim sekunden As String
    35. If Convert.ToInt32(Date.Now.Second) < 10 Then
    36. sekunden = "0" & Convert.ToString(Date.Now.Second)
    37. Else
    38. sekunden = Convert.ToString(Date.Now.Second)
    39. End If
    40. Dim millisekunden As String
    41. If Convert.ToInt32(Date.Now.Millisecond) < 10 Then
    42. millisekunden = "00" & Convert.ToString(Date.Now.Millisecond)
    43. ElseIf Convert.ToInt32(Date.Now.Millisecond) < 100 Then
    44. millisekunden = "0" & Convert.ToString(Date.Now.Millisecond)
    45. Else
    46. millisekunden = Convert.ToString(Date.Now.Millisecond)
    47. End If
    48. txtAusgabe.Text = text & Convert.ToString("<--" & tag & "." & monat & "." & Date.Now.Year & " " & stunden & ":" & minuten & ":" & sekunden & "." & millisekunden & " [RX] - " & input & vbCrLf)
    49. txtAusgabe.SelectionStart = Len(txtAusgabe.Text)
    50. txtAusgabe.ScrollToCaret()
    51. txtAusgabe.Select()
    52. Catch ex As Exception
    53. txtAusgabe.Text = text & Convert.ToString(ex) & vbCrLf
    54. End Try
    55. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.b_om“ ()

    Ich habe es schon mit dem versucht:
    Spoiler anzeigen

    Quellcode

    1. Dim text As String
    2. If InStr(SerialPort.ReadExisting(), Chr(13)) Then
    3. text = SerialPort.ReadExisting().Substring(0, SerialPort.ReadExisting().IndexOf(Chr(10)))
    4. Me.Invoke(Sub() WriteReceivedData(text))
    5. End If

    Leider funktionierte das nicht. Es schrieb nicht einmal etwas hin. Also geht es nicht in das If.
    Ich habe auch keine Möglichkeit gefunden sonst das <CR> im String zu finden.
    Danke für den anderen Link.

    a.b_om schrieb:

    If InStr(SerialPort.ReadExisting(), Chr(13)) Then
    text = SerialPort.ReadExisting().Substring(0, SerialPort.ReadExisting().IndexOf(Chr(10)))
    Du kannst nur einmal auslesen! Beim zweiten Read sind die Daten schon weg.
    Lese mit ReadExisting in eine Variable ein und nimm diese für die Nachbehandlung.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich weis nicht genau wie dein Output aussehen soll, aber vielleicht geht es auch mit String.Replace.

    VB.NET-Quellcode

    1. Sub test()
    2. Dim Text As String = "Hallo ich bin ein Test" & vbCrLf & " mit vbCrLf" & vbCrLf & "und noch einem vbCrLf"
    3. Me.Invoke(Sub() WriteReceivedData(Text))
    4. End Sub
    5. Private Sub WriteReceivedData(ByVal input As String)
    6. Dim sZeilenanfang As String = String.Format("<--{0} [RX] - ", Date.Now.ToString("dd.MM.yyyy HH:mm:ss.fff"))
    7. txtAusgabe.Text = sZeilenanfang & input.Replace(vbCrLf, vbCrLf & sZeilenanfang) & vbCrLf
    8. End Sub

    @a.b_om
    Versuche es einmal so:

    VB.NET-Quellcode

    1. Dim DeineTextTeile = DeinText.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)

    Im StringArray DeineTextTeile befinden sich dann deine gesuchten Zeilen und mit denen kannst du weitermachen...
    @petaod war da schneller...

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

    Vielen Dank für die raschen Antworten. Wie schon bei Post(7) gesagt, darf diese Methode nur dann aufgerufen werden, wenn es auch ein vbcrlf im String vorkommt. Sonst würden eure Ideen auch sehr gut funktionieren. Mir fehlt eben nur noch ein If.

    a.b_om schrieb:

    Wie ich das Problem lösen kann, weiss ich.
    Offensichtlich nicht.
    Das Port hat eine Property .NewLine, der weist Du CrLf zu.
    Dann rufst Du bei Bedarf oder im DataReceived-Event Port.ReadLine auf und hast eine Zeile eingelesen und musst nicht splitten. 8o
    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!

    a.b_om schrieb:

    das weiss ich.
    Dann tue es.
    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!
    Mit dem, was ich weiss, könnte ich maximal den Plan aber nicht den Cod machen.

    1. Teile das String in alle Zeichen auf(Leerzeichen auch berücksichtigen)
    2. Wandle die Zeichen in Bytes um und speichere diese in ein Array
    3. Suche nach Byte 13 und 10
    3.1 Wenn gefunden schneide das Array nach dem Byte 10 ab und gib dieses Array aus.
    3.2 Wenn nicht gefunden, Funktion verlassen

    Das müsste das Programm machen.

    Den Code könnte ich nicht machen...
    Kannst du eigentlich nicht anhand des Datenformats entscheiden, was zu tun ist?
    So ist das eine gefährliche Angelegenheit.
    Es ist ja nicht sichergestellt, dass beim DataReceived Event von dem zweizeiligen Record bereits beide da sind.
    Es könnte ja auch sein, dass zwei Events kommen, für jede Zeile eines.
    Die behandelst du in dem Fall wie zwei Einzeiler.

    Oder was macht deine spezielle Methode, die du bei CrLf ausführst?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    a.b_om schrieb:

    könnte ich maximal den Plan aber nicht den Cod machen.
    Kommt in Deinem Code .ReadLine vor (Siehe Post #12)?
    Wenn nein - warum nicht?
    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!
    @petaod

    petaod schrieb:

    Oder was macht deine spezielle Methode, die du bei CrLf ausführst?

    Schau auf Post 1 im Spoiler die Methode WriteReceivedData.

    @RodFromGermany
    Also liest das .ReadLine nur aus, wenn es dieses vbCrLf hat? Ich verstehe es nicht.

    a.b_om schrieb:

    wenn es dieses vbCrLf hat?
    Nein.
    Das Zeilenende ist durch den Inhalt der Property MyPort.NewLine definiert.
    Wie lange brauchst Du, um das auszuprobieren?
    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
    Ich hab das jetzt so gemacht, aber es gibt ein TimeoutException.

    Quellcode

    1. Private Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
    2. Try
    3. Me.Invoke(Sub() WriteReceivedData(SerialPort.ReadLine()))
    4. Catch ex As Exception
    5. End Try
    6. End Sub


    Habe ich etwas falsch verstanden?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.b_om“ ()