Serialportausgabe in 2 textboxen splitten

  • VB.NET

Es gibt 103 Antworten in diesem Thema. Der letzte Beitrag () ist von milito.

    Hilfreich ist immer...
    Einen sogenannten Pseudo-Code zu verwenden. Sprich... Du musst ja nicht wissen, wie die Befehle sind... Du musst erstmal nur wissen, was dein Programm logisch tun soll.
    Wenn du das hier vorstellst... dann können wir dir auch weiter helfen, wie du dafür die geeigneten Befehle findest und sie anwendest.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Hi also bin einen schritt vorwärts gekommen , doch brauche nochmal eure hilfe und mein jetziger stand ist wie folgt,



    Habe eine Serialport ausgabe in einem fesnter, die wie folgt aussieht:

    ok
    I2C-Device at ox45 is found
    ok
    Array ist initialized
    Parameter;Reg;Data
    +
    1,2,4
    4,5,6
    7,8,9
    +


    Wichtig: Das empfangen läuft über den ReceiveData handler.
    So nun möchte ich immer, dass der angezeigte inhalt, der sich innerhalb der beiden + befindet in einer anderen Textbox angezeigt wird und der ausserhalb der + in einem zweiten, ist es möglich?

    Wie kann ich das realisieren?

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

    So was:

    VB.NET-Quellcode

    1. Dim txt = DEIN_TEXT_HALT
    2. Dim i1 = txt.IndexOf("+"c)
    3. Dim i2 = txt.LastIndexOf("+"c)
    4. Dim txt2 = ""
    5. If i1 <> i2 AndAlso i2 <> -1 Then
    6. txt2 = txt.Substring(i1 + 1, i2 - i1 - 1)
    7. End If
    8. MessageBox.Show("@" & txt2 & "@")
    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!
    Hierfür bietet sich RegEx an.

    EDIT: RegEx ist wohl für sowas gedacht.
    Da musste dann nicht so ne Funktion selber bauen. Auch wenn das möglich ist.

    Hier nen netter Link:
    stackoverflow.com/questions/76…en-get-all-strings-betwen
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    milito schrieb:

    muss ich das im datareceive handler platzieren
    Nein.

    milito schrieb:

    ein beispiel vllt wie ich das machen kann?
    Hast Du doch gerade bekommen.
    Streng mal Deinen Grips an und arbeite das in Dein Projekt ein.
    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:


    So was:

    VB.NET-Quellcode

    1. Dim txt = DEIN_TEXT_HALT
    2. Dim i1 = txt.IndexOf("+"c)
    3. Dim i2 = txt.LastIndexOf("+"c)
    4. Dim txt2 = ""
    5. If i1 <> i2 AndAlso i2 <> -1 Then
    6. txt2 = txt.Substring(i1 + 1, i2 - i1 - 1)
    7. End If
    8. MessageBox.Show("@" & txt2 & "@")




    so nun habe dochn e frage zu dem code und zwar, wofür das +c ?

    Die nächste frage ist, dass mit dem i1+1 weißt doch darauf hin ein stelle nach dem ersten + oder?

    bzw was ist damit gemeint?
    If i1 <> i2 AndAlso i2 <> -1 Then
    txt2 = txt.Substring(i1 + 1, i2 - i1 - 1)



    milito schrieb:

    +c
    Meinst Du "+"c? Das ist ein "+"-Char im Gegensatz zu einem "+"-String.

    milito schrieb:

    ein stelle nach dem ersten + oder?
    Ja.
    Spiel mit dem Code rum, lass das "+ 1" und das "- 1" mal weg und sieh nach, was passiert. :D
    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!
    HI also bin etwas vorangekommen doch immer noch nicht ganz :(.

    hab folgende ausgabe :

    ok
    array initi....
    Sd card initi..
    Card initi...

    =====File content=======
    Anz_paramadresse;reg;Data
    1;2;3
    2;3;4;
    ========End==========

    Scan I2c
    Device found at 0x45

    SO ich möchte den Inhalt innerhalb ====File content ==== und ===End === während dem empfangen in die textbox2 ausgeben und den rest in die textbox1



    leider gelingt mir es nicht so ganz.

    Hier mien code:


    VB.NET-Quellcode

    1. Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort_i2c.DataReceived
    2. 'das was an buffer ist wird an variable drangehängt und somit nicht ueberschrieben
    3. inputdata = inputdata & SerialPort_i2c.ReadExisting
    4. Dim i1 = inputdata.IndexOf("File content")
    5. Dim i2 = inputdata.LastIndexOf("End")
    6. Dim parameter = ""
    7. 'HIer wird die funktion aufgerufen, weil damit gibt eskeine verzögerung,
    8. 'd.h. da wird alles was im EMpfangsbuffer anliegt ausgelesen und ausgegeben. -> brauche im Event vom Button klick nicht definieren
    9. 'da arduino nur sendet wenn er Dollarzeichen erhält, also -> receive, da kommt erst eventhandler datarecieved zum arbeiten
    10. Me.Invoke(Sub()
    11. If i1 <> i2 AndAlso i2 <> -1 Then
    12. parameter = inputdata.Substring(i1 + 1, i2 - i1 - 1)
    13. ListBox_parameter_i2c.Items.Insert(0, parameter)
    14. 'MsgBox(parameter)
    15. Else
    16. RichTextBox1.Text = inputdata
    17. End If
    18. 'ListBox_parameter_i2c.Text = inputdata
    19. '----wenn Gui empfängt, dann lade die Progressbar auf 100 %-------'
    20. '-----d.h. hier ist progress =1 --------'
    21. progress = 1
    22. Progress_i2c.Value = 100
    23. 'wenn ich erneut drücke, d.h die progress var =1 dann erneut laden----'
    24. 'd.h. zuerst auf 0 und dann wieder auf 100%
    25. If progress = 1 Then
    26. Progress_i2c.Value = 0
    27. Progress_i2c.Value = 100
    28. End If
    29. End Sub)
    30. End Sub



    Kann mir da jemand bitte helfen?
    Hab es versucht es geht nicht und das mit dem +1 uund -1 is immer noch nicht klar :(

    milito schrieb:

    Kann mir da jemand bitte helfen?
    Wie lang war das eine Suchzeichen, dass Du oben stehen hattest?
    Wie lang sind die Suchstrings, die hier eben erstmals auftauchen?
    Vielleicht hast Du einfach Dein Problem falsch beschrieben und wendest eine richtige Lösung auf ein falsches Problem an. :S
    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!
    Problem ist, dass diese unterscheidlich lang sind, also gibt es dafür keine lösung? Der inhalt zwischen den ===File content ==== und ====END==== ist variabel . Das is nämlich der inhalt der SD-card.

    Gibt es keine möglichkeit?

    milito schrieb:

    also gibt es dafür keine lösung?
    Sie steht da, Du musst sie Dir nur aus 2 Posts und der Antwort auf meine Fragen zusammenbasteln.
    Tue es. :thumbsup:
    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!
    Du machst es dir echt schwer oO

    Kannst du vielleicht das besser verstehen?

    VB.NET-Quellcode

    1. Dim WertArray() As String = RichTextBox1.Text.Split(CChar(vbLf)) 'Hier wird der Inhalt (in meinem Fall aus ner RichtTextBox) in ein Array geschrieben
    2. Dim Begin As Boolean = False
    3. Dim Ergebnis As String = ""
    4. For Each Wert As String In WertArray 'Hier wird das komplette Array Zeile für Zeile durchlaufen
    5. If Wert.ToLower.Contains("file content") Then 'Wenn die Zeile "file content" enthält wird ab da verarbeitet
    6. Begin = True
    7. ElseIf Begin Then
    8. If Wert.ToLower.Contains("end") Then Exit For 'Wenn die Zeile "end" enthält, wird die Schleife beendet
    9. Ergebnis += String.Concat(Wert, vbLf) 'Das Ergebnis wird immer um die aktuelle Zeile erweitert
    10. End If
    11. Next
    12. MessageBox.Show(Ergebnis)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    ok danke dir . Also kann ich das in dem DataReceiveHandler anwenden, da von dort ja meine Daten empfangen werden?

    Also es sollte sich so verhalten das Programm:

    drücke ich den Scan-i2c button -> ausgabe in txtbox1
    drücke ich receive button -> Inhalt innerhalb von ===Begin=== und ===end=== soll in -> txtox 2 und der rest in txtbox1
    So sollte das ganze ablaufen.
    D.h. dein Bsp könnte ich anpassen und der würde dann in dem Eventhandler platziert werden? verstehe ich das richtig, d.h. mit dem array nehme ich alles empfangene zuerst auf und kann dann das so ausselktieren, dass ich die ausgaben in den verschiedenen txtboxen umleite?
    So hab es jetzt mal ausprobiert, hab es fast hinbekommen, nur problem ist, in der Messagebox bekomme ich diese zeilenweise aus , wenn
    ich aber sage, füge diese mir in die listbox bekomme ich diese alle in einer zeile doch mehrmals, was kann das sein?

    das ist der codeteil:

    VB.NET-Quellcode

    1. Dim WertArray() As String = Richtextbox1.Text.Split(CChar(vbLf))
    2. For Each Wert As String In WertArray
    3. If Wert.ToLower.Contains("file content") Then '
    4. Begin = True
    5. ElseIf Begin Then
    6. If Wert.ToLower.Contains("end") Then Exit For 'Wenn die Zeile "end" enthält, wird die Schleife beendet
    7. Ergebnis += String.Concat(Wert, vbLf) 'Das Ergebnis wird immer um die aktuelle Zeile erweitert
    8. listbox_i2c_editparameter.Items.Add(Ergebnis)
    9. End If
    10. Next
    11. 'listbox_i2c_editparameter.Items.Add(Ergebnis)


    Gibt es die möglichkeit, diesen Inhalt diesen Inhalt den ich verarbeiten möchte nur in die textbox2 anzeigen zu lassen, so wird er nämlich in der richttextbox1 und in der Richtextbox2 angezeigt, wäre das möglich?

    Und warum bekomme ich die ausgabe in der MSGBOX zeilenweise und in der listbox nicht, was mache ich falsch?
    beim mehrmaligen drücken von dem receive-button funktioniert das nicht richtig , im anhang noch ein bild dazu. :(
    Bilder
    • 2013-08-04_183817.jpg

      18,61 kB, 248×321, 32 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „milito“ ()

    Habe nochmal zu meinem obigen code einen Ablauf dargestellt, vllt ist es besser verständlich, wie ich das meine.
    Wäre es möglich dies zu lösen laut dem angehängten bild?
    Bilder
    • split.png

      26,59 kB, 1.007×562, 35 mal angesehen

    milito schrieb:

    Wäre es möglich dies zu lösen
    Ja.

    RodFromGermany schrieb:

    milito schrieb:

    also gibt es dafür keine lösung?
    Sie steht da, Du musst sie Dir nur aus 2 Posts und der Antwort auf meine Fragen zusammenbasteln.
    Tue es. :thumbsup:
    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!
    Also ne Listbox kann soweit ich weiß keinen Zeilenumbruch darstellen.

    VB.NET-Quellcode

    1. Ergebnis += String.Concat(Wert, vbLf) 'Das Ergebnis wird immer um die aktuelle Zeile erweitert
    2. listbox_i2c_editparameter.Items.Add(Ergebnis)

    Schau dir das mal an. Hier liegt der Fehler.

    Du ergänzt hier immer die Variable Ergebnis und fügst sie jedes mal neu deiner Listbox zu.
    Jetzt musst du drüber nachdenken, was zu ändern ist, damit er die Inhalte nicht mehrfach anzeigt. ;)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ja ok :D. Aber ich muss sie doch mit Add hinzufügen, sonst kenne ich nur listbox_i2c_editparameter.Items.insert(0,ergebnis) aber das geht auch nicht bekomme sie alle in einer zeile und wiederholt.



    komme wirklich nicht mehr weiter, sorry