Serialportausgabe in 2 textboxen splitten

  • VB.NET

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

    Also vielleicht solltest du das ganze mal bisl distanzierter betrachten und drüber reflektieren ^^

    Du hast zwei Funktionen die ne Liste erstellen... Machst dir dadurch ne Liste voller Listen...
    Um nur eine Liste zu erstellen kannst zu an zwei stellen ansetzen...

    Die eine scheinst du nicht lösen zu können. Also versuch einfach mal die Erstellung der anderen Liste zu umgehen.
    Du musst doch nicht ne Liste erstellen um sie in eine Listbox zu schreiben...
    Wenn du weißt wie du einzelne ListBox-Elemente einfügst...
    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
    Na, du hast doch die zwei Befehle:

    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


    Der erste ergänzt die Variable "Ergebnis" bei jedem Schleifendurchlauf um eine neue Zeile
    Der zweite fügt bei jedem Schleifendurchlauf die Liste "Ergebnis" in eine Listbox.

    Nun musst du überlegen, was du ändern musst, damit er nicht immer eine Ergebnisliste in die Listbox hintendran schreibt.
    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

    milito schrieb:

    kann mir jeman bitte helfen?
    ICh habe eher das Gefühl, Du wartest auf eine fertige Lösung für Dein Problem. :thumbdown:
    Ergreif die Initiative und schreib die Lösung auf, sie steht hier im Thread.
    Lesen musst Du allerdings allein.
    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!
    Dann beschreib Dein Problem noch mal aus jetziger Sicht.
    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 ich möchte folgendes realisieren, was bei mir nicht funktioniert und zwar habe 3 buttons (send, scan i2c und receive). beim betätigen der buttons werden auch Ausgaben, die vom Serialport gesendet werden in der GUI in einem Fenster angezeigt unter anderem auch die bekannten Parameter, die beim bei beginn mit ===file content=== und beim ende mit ===end=== markiert sind, d.h. meine Parameter stehen zwischen === file content und ===end=== (anhand von button receive)

    SO nun wie auf dem bild zu sehen ist, werden alle eingekommenden Meldungen vom Serialport anhand des DataReceiveHandler in einer Stringvariable inputdata gespeichert und in der Textbox1 ausgegeben.

    Ich möchte aber, dass ich die den Bereich zwischen ===file content und ===end=== direkt in die listbox2 / textbox2 umgeleitet werden und der rest in die Textbox1 angezeigt werden, und genau das bekomme ich nicht hin. Siehe bild:
    Bilder
    • split.png

      26,59 kB, 1.007×562, 32 mal angesehen
    So.
    Mach Dir ein neues WinForms-Projekt mit einem Button und 2 TextBoxen.
    In die ButtonClick schreibst Du einen Text, den Du splittest und aufteilst.
    Da musst Du kein SerialPort bemühen.
    -----
    Wenn Du IndexOf(DEIN_TEXT_1) bemühst, musst Du natürlich die Länge des Textes DEIN_TEXT_1 berücksichtigen, wenn Du nach DEIN_TEXT_1 mit dem Ausschneiden beginnen willst.
    Selbiges gilt für DEIN_TEXT_2.
    Oben hattest Du ein Beispiel mit nur einem Zeichen, da ist die Länge natürlich 1, hier ist sie offensichtlich länger, das ist Dir aber nicht aufgefallen, weil Du noch nicht gelernt hast, Dein Programm zu debuggen. :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!
    Hi , also bin jetzt weitergekommen habe das mit dem splitten besser hinbekommen, doch es hat noch kleine macken, das ist mein 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. 'HIer wird die funktion aufgerufen, weil damit gibt eskeine verzögerung,
    5. 'd.h. da wird alles was im EMpfangsbuffer anliegt ausgelesen und ausgegeben. -> brauche im Event vom Button klick nicht definieren
    6. 'da arduino nur sendet wenn er Dollarzeichen erhält, also -> receive, da kommt erst eventhandler datarecieved zum arbeiten
    7. Me.Invoke(Sub()
    8. Dim beginningLine As Integer 'notiere Zeilenzahl vom arry wo ===file begin kommt
    9. Dim endLine As Integer 'notiere Zeilenzahl vom array wo ===end== kommt
    10. Dim WerteArray() As String = Split(inputdata, vbCrLf) 'Befülle Array mit den Zeilen der RTB mit zeilenweise
    11. RichTextBox1.Clear() 'lösche richttextbox
    12. For Each line As String In WerteArray 'überprüfe jede zeile auf ===file content=== und ===end ===
    13. Select Case line
    14. Case "===file content===" 'wenn gefunden
    15. beginningLine = Array.IndexOf(WerteArray, line) 'notiere zeile wo file content vorkommt
    16. Case "===end==="
    17. endLine = Array.IndexOf(WerteArray, line)
    18. Case Else
    19. RichTextBox1.AppendText(line & vbCrLf) 'sonst schriebe in richtextbox
    20. End Select
    21. Next
    22. If beginningLine >= 0 Then 'wenn beginnline >=0
    23. listbox_i2c_editparameter.BeginUpdate()
    24. listbox_i2c_editparameter.Items.Clear() 'wird nicht drangehängt sondern gelöscht und immer neues angezeigt For i As Integer = beginningLine To endLine ' trage die zeilen ein von beginning line bis endline
    25. listbox_i2c_editparameter.Items.Add(WerteArray(i)) 'füge zeilen von beign to end in listbox
    26. Next
    27. listbox_i2c_editparameter.EndUpdate() 'bende update
    28. RichTextBox1.ScrollToCaret() 'sodass er runterscroll und das aktuellste zeigt
    29. End If
    30. '----wenn Gui empfängt, dann lade die Progressbar auf 100 %-------'
    31. '-----d.h. hier ist progress =1 --------'
    32. progress = 1
    33. Progress_i2c.Value = 100
    34. 'wenn ich erneut drücke, d.h die progress var =1 dann erneut laden----'
    35. 'd.h. zuerst auf 0 und dann wieder auf 100%
    36. If progress = 1 Then
    37. Progress_i2c.Value = 0
    38. Progress_i2c.Value = 100
    39. End If
    40. End Sub)
    41. End Sub




    So das problem ist erstens: meine parameter werden angezeigt, doch mit der markeirung ===file content=== und ===end=== ist es möglich alles erst NACH ===file content=== bis VOR ===end=== anzuzeigen?

    zweites Problem: also falls ich neue Daten über Serial an die SD karte sende und ich dann auf receive erneut drücke, aktualisiert sich meine gespplittete ausgabe der Parameter zwar, doch der zuletzt gesendete wert wird nicht angezeigt, obwohl er in der SD karte geschrieben wurde, dazu muss ich die GUI schliessen , sie erneut öffnen und erneut auf receive drücken, dann kann ich ihn auch in der gesplitteten ausgabe sehen, wo liegt das problem bzw der fehler in meinem code?
    Lagere mal die invoke-te Sub als separate Sub aus und ruf diese mit Invoke auf.
    Da kannst Du wenigstens im Quelltest debuggen.
    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!
    Mir fällt auf, das deine 'Protokollbefehle' unnötig gross sind. Schick doch z.B. 0x02 für FILE-CONTENT und 0x03 für END-CONTENT.
    Für Die Datenüberträgung der Daten auf der SD-Karte dann 0x01 zum starten und 0x04 zum beenden.

    Das senkt die Datengrösse -> Daten sind schneller durch, ebenso ist das auch schneller zum verarbeiten. Wieso 18 Bytes-Befehle senden, wenn ein Viertel Byte (2 Bits) auch reicht ^^

    Schau dir sonst mal die ASCII-Tabelle an, von 0x00 bis und mit 0x1F kannst du alles nutzen (Theoretisch immerhin 32 Befehle mit nur einem Byte ^^)

    mfg

    gfc
    wie mienst du das mit dem separatem invoken?

    liegt es daran? Hab das Überwachungsfenster verwendet, um das zu debuggen, somit habe ide die relevanten variablen unter anderem den Wertearray() unter die lupe genommen und er holte den aktuellen wert nicht rein, erst wenn ich die GUI wieder starte :(.

    liegt es also daran?

    Und zu dem file content und end, hast recht werde es ändern, damit die übertragung auch schneller ist.

    milito schrieb:

    separatem invoken?
    So:

    VB.NET-Quellcode

    1. Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort_i2c.DataReceived
    2. inputdata &= SerialPort_i2c.ReadExisting
    3. Me.Invoke(Sub() Me.DoIt())
    4. End Sub
    5. Private Sub DoIt()
    6. ' und hier den ganzen Code rein
    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!
    Hi hab das Programm mal gedebuggt und hae gemerkt, also in der textbox1, in der alles ausgegeben wird(auch die Parameter) werden die aktuellen parameter aus der SD-karte angezeigt, doch sie werden nicht in dem in der gesplitetet listbox angezeigt :(.
    Liegt es eventuell am Array?

    milito schrieb:

    Liegt es eventuell am Array?
    Wohl eher am Split.
    Setz mal einen Haltepunkt drauf und überzeuge Dich, was da wie gesplittet wird. Da solltest Du schnell rauskriegen, was da schief läuft.
    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 meinst die stelle, wo ich meinen Inhalt der richttextbox in den Wertearray lade?
    also die stelle hier:

    VB.NET-Quellcode

    1. Dim WerteArray() As String = Split(inputdata, vbCrLf) 'Befülle Array mit den Zeilen der RTB mit zeil


    normalerweise sollte er doch dort im den aktuellsten inputdata reinladen oder täusche ich mich?
    Was für ein Trennzeichen ist denn tatsächlich zwischen den Zeilen?
    vbCr
    vbLf
    vbCrLf
    :?:
    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 mein Arduino liest die CSV datei aus, die sid daschon zeilenweise getrennt, also in dem fall
    1;2;3

    3;4;4

    usw..



    die parameterübertragung wird mit einem Newline in dem fall:

    SerialPort_i2c.Write(lsitbox_editparameter_i2c.SelectedItem)
    SerialPort_i2c.Write(Environment.NewLine)

    an dem Arduino übergeben und der Arduino wartet bis dann eine ASCII in dez 13, also mit einem CR undschriebt diese in die csv.Datei rein.

    Leigt es also an dem Trennzeichen?

    milito schrieb:

    Leigt es also an dem Trennzeichen?
    Sieht so aus, denn Du splittest mit vbCrLf

    milito schrieb:

    VB.NET-Quellcode

    1. Dim WerteArray() As String = Split(inputdata, vbCrLf) 'Befülle Array mit den Zeilen der RTB mit zeil
    Nimm mal vbCr.
    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!