Inhalt einer Listbox(von einer GUI ) in der SD karte mit arduino speichern

  • VB.NET

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

    Inhalt einer Listbox(von einer GUI ) in der SD karte mit arduino speichern

    Hallo habe zum größtren Teil mein Programm fertig. Nun habe eine GUI, die Parameter in diesem Format(1;2;3;4) an dem Arduino sendet und diese vom Arduino in eine csv.Datei auf die SD-Karte speichert.
    Nun kann die GUI auch per Serialport, den kompletten CSV.Datei inhalt(wo die parameter stehen) auch vom arduino empfangen und werden in eine Listbox angezeigt in folgende, format:

    1;2;4;4
    2;3;3
    1;2;3
    usw.
    Nun ist es meine Absicht in diese Listbox weitere Werte über die GUI hinzuzufügen oder einen Eintrag zu editieren. Damit die änderungen auch erhalten bleiben möchte ich dann den kompletten neuen inhalt der Listobx an dem Arduino senden, somit er diesen mit dem alten inhalt der CSV-Datei überchreibt. Nur weiß ich nicht , wie ich diesen kompletten inhalt vom Arduino so verarbeitet wird, dass er diesen aufnimmt und zeilenweise in die csv datei schreibt.

    Wäre sowas möglich, und wie ?


    Das ist mein VB.code, der die einträge der listbox an dem Arduino sendet:


    VB.NET-Quellcode

    1. For Each ListItem As String In listbox_i2c_editparameter.Items
    2. parameter = ListItem
    3. SerialPort_i2c.Write(parameter)
    4. SerialPort_i2c.Write(Environment.NewLine)
    5. Next
    6. SerialPort_i2c.Write(".")
    7. MsgBox("Parameterlist was saved in I2C.csv")


    und das der Teil vom Arduino, der diesen Inhalt komplett zeilen weise in die csv. datei schrieben sollte:

    Quellcode

    1. void write_SD()
    2. {
    3. if (Serial.available()>0)
    4. {
    5. if (inByte ==13) //enter
    6. {
    7. Serial.println("Initializing SD Card...");
    8. if (!SD.begin(chipSelect))
    9. {
    10. Serial.println("Initialization failed");
    11. return; //tue nichts
    12. }//endif
    13. Serial.println("SD Card initialized");
    14. if (SD.exists("test2.csv"))
    15. {
    16. Serial.println("File exists");
    17. }
    18. else
    19. {
    20. Datei=SD.open("test2.csv", O_CREAT | O_WRITE);
    21. Datei.println("Anz_Parameter;Adresse;Register;Data");
    22. Datei.close();
    23. }
    24. //Schreibzugriff
    25. Datei= SD.open("test2.csv", O_CREAT | O_WRITE); //Das gleiche wie FILE_WRITE. doch es beschleunigt das Schrieben auf SD
    26. //Datei=SD.open("test2.txt", FILE_WRITE);
    27. //falls Datei ok, schreibe
    28. if (Datei)
    29. {
    30. //delay(150); //verzögerung, da schreiben auf SD karte langsamer ist
    31. //Datei.write(Test); //ohne zeilenumbruch
    32. //Datei.write(13); //schreibe nach jedem eintrag ein carriage return line feed, damit strings zeilenweise einetragen werden
    33. Serial.println("inhalt vor der csv");
    34. Serial.println(Text);
    35. Datei.print(Text);
    36. Datei.println(); //Damit er in neue zeile schreibt
    37. //inhalt von Array Text in SD schreiben(commands.txt)-> println mit zeilenumbruch
    38. Datei.close(); //Damit änderung gespeichert werden, diese Datei schliessen
    39. Serial.println("Data stored in SD card");
    40. /*Nachdem enter gekommen ist und daten gespeichert wurden
    41. setze Array wieder auf 0 und lösche inhalt*/
    42. index=0; //index auf 0 initialisieren
    43. memset(&Text[0], 0, sizeof(Text)); //durch memset wird Array gelöscht
    44. Serial.println("Array initialized");
    45. }//endif datei vorhanden?
    46. }//endif kontroll enter
    47. else//fals kein enter,soll weiter in array speichern
    48. {
    49. if (index <400)//schauen , ob array overflow hat //vorher 400
    50. {
    51. Text[index]=inByte; //solange kein ´Enter vom Arduino empfangen wird, schreibe in Array
    52. index++; //und zähle position hoch -> z.b. wenn ich hallo sende-> jeder buchstabe bekommt eine position
    53. delay(100);
    54. }//endif check array of overfolw
    55. }//end else
    56. }//endif serial available
    57. }//end fu


    nur leider werden nur teile davon reingeschrieben und nicht alles :(.
    Weiß jemand vllt wie man das besser machen kann? bzw wo der fehler ist?
    Anbei noch ein bild, wie das funktionieren sollte
    Bilder
    • split.png

      45,01 kB, 1.360×562, 195 mal angesehen
    Könntest du dein Protokoll oder eine kurze Fuktionsweise erklären?

    Wenn ich richtig verstehe, möchtest du Daten vom PC in die SD-Karte deines Arduino's schicken.

    Also das sollte kein Problem sein. Inhalt der ListBox lesen, per UART an dein Arduino senden und dieser speichert jedes Zeichen auf deiner SD-Karte.
    Wenn die Datenpakete (pro Zeile) nicht allzu gross sind (Sagen wir mal kleiner als 64Byte) dann ist das kein Problem. Du sendest die 1. Zeile von deiner Listbox, Arduino sammelt diese in einer Variable. Wenn die erste Zeile gelesen ist, sendest du noch das 'Enter/NeueZeile' Zeichen. Das Arduino schreibt des auch und du sendest weiter daten....

    Tada =D

    mfg

    gfc
    Ok zur funktionsweise: also meine Gui soll Daten also Parameter an dem Arduino senden, der diese zeilenweise in eine csv.Datei speichert.
    Die Parameter werden folgendermaßen gesendet-> z.b. 1;2;4, d.h. die drei parameter werden als eine zeile gesendet usw.
    Nun kann meine gui auch die Daten der SD karte vom arduino empfangen, d.h. der arduino liest diese aus der csv datei aus und sendet diese an der Gui, die dann in die Listbox folgendermaßen gezeigt werden:

    1;2;4
    2;3;5
    usw..

    Nun kann meine GUI auch diese empfangen daten(also den kompletten inhalt der sd) auch editieren, d,h, kann jeden einzelnen Eintrag dieser Listbox ändern oder löschen oder neue Parameter hinzufügen. Nehmen wir mal an ich habe der listbox einen Weiterern Parameter hinzugfügt dann würde es zb. so aussehen:

    1;2;4
    2;3;4
    5;7;7
    Das ist jetzt mein neuer SD karten inhalt, der jetzt komplett in die SD karte bzw csv datei anhand vom arduino gespeichert werden muss.
    und genau das bekomme ich nicht hin, den die parameter könnten natürlich auch mehrere sein, d,h, mehrere oder wenige parameter zeilen.
    So zu sagen möchte ich den inhalt
    1;2;4
    2;3;5
    der in der sd karte enthalten ist, komplett mit dem inhalt :

    1;2;4
    2;3;5
    5;7;7 ersetzen, sodass ich über die GUI den inhalt ändern kann und ihn dann so abspeichern kann in der csv dateiWie könnte ich das machen? Kannst du mir eventuell nen beispiel geben oder wo ich das ändern soll?
    meinst du das etwa in der art und weiße? :
    GUI:

    VB.NET-Quellcode

    1. For Each ListItem As String In listbox_i2c_editparameter.Items
    2. parameter = ListItem
    3. SerialPort_i2c.Write(parameter)
    4. SerialPort_i2c.Write(Environment.NewLine)
    5. Next
    6. SerialPort_i2c.Write(".")
    7. MsgBox("Parameterlist was saved in I2C.csv")


    und Arduino:

    VB.NET-Quellcode

    1. while (Serial.available())
    2. {
    3. char parameter = Serial.read();Datei.println(var);
    4. }



    und wie meinst du das mit den 64Byte , wie weiß ich wie groß das ist was ich sende?

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

    Ja, so in der Art meine ich das. Wenn du schon in der GUI selber eine Neue Zeile mitsendest, ersparst du dem Arduino etwas Arbeit.

    Zum Lesen:
    Ich würde es genauso wie beim Client machen: Zeile für Zeile schicken. Aber nicht die ganze Datei auf einmal öffnen und absenden. Wenn diese zu gross ist, kann der Speicher fehlerhaft werden und deine Daten sind dann ungenau / beschädigt.

    Mit dem Netduino geht das ganz einfach mit ReadLine/WriteLine. Wie es beim Arduino aussieht weiss ich selber nicht. Du könntest auch im Arduino überprüfen wann eine Neue Zeile beginnt und dich so daran zu orientieren. (Entweder ist es 0xA/LF oder 0xC/CR für eine neue Zeile. Ich schätze das es eher 0xA ist)

    Kannst auch so machen, das du die Datei in einem Buffer einliest, bis dieser voll ist, dann das Zeug sendest und wieder den restlichen Text liest bis du die Datei durch bist.

    mfg

    gfc
    Hi ich komme leider nicht weiter, ich weiß nicht wie ich das mit dem empfangen der einzelnen zeilen im arduino machen soll, bzw. wenn ich alle zeilen erhalten habe und diese zeile für zeile in die sd schreibe oki, aber wie mache ich das falls ich den in der listbox was ändere und die zeilen in der sd mit den neuen überschrieben soll?



    Wie mache ich dass , dass ich dann sage, ok ich sende die geänderte listboxeinträge erneut und überschriebe die alte datei auf der SD?
    Sry, kann dir Codemässig nicht gross helfen, ich beschäftige mich nur mit C bei Microcontroller.

    Da musst du wohl über die Bücher, sollte aber nicht schwer zu realisieren sein.
    So nun bin ein schritt weter gekommen aber es funktioniert immer noch nicht, bekomme nichts auf die SD karte geschrieben, kann jemand vllt helfen?

    Hier mein code dazu?

    VB-COde:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_saveToSD.Click
    2. Try
    3. For Each ListItem As String In listbox_i2c_editparameter.Items
    4. parameter = ListItem
    5. SerialPort_i2c.Write(parameter)
    6. SerialPort_i2c.Write(13)
    7. Next
    8. MsgBox("Parameterlist was saved in I2C.csv")





    Arduino Code:

    VB.NET-Quellcode

    1. if(!SD.begin(chipSelect))
    2. {
    3. Serial.println("No SD-card");
    4. return;
    5. }//end if Sd.begin
    6. Serial.println("SD-card ok");
    7. //-----------überprüfen Datei da---------------------//
    8. // wenn ja= löscheu nd erstelle eine neue ,sonst//
    9. //wenn keine da, erstelle neue Datei//
    10. if(SD.exists("I2C.csv"))
    11. {
    12. SD.remove("I2C.csv");
    13. Datei=SD.open("I2C.csv",O_CREAT | O_WRITE);
    14. Datei.println("Anz_para | Address | Register | Data |");
    15. Datei.close();
    16. write_SD();
    17. }//sd exists
    18. //falls Datei nicht vorhanden erstelle neue Datei
    19. else
    20. {
    21. Datei=SD.open("I2C.csv",O_CREAT | O_WRITE);
    22. Datei.println("Anz_para | Address | Register | Data |");
    23. Datei.close();
    24. write_SD();
    25. }//end else