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 überchriebt. 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 ?

Vermutlich verstehe ich dein Problem nicht.
( Das Bild ist jedenfalls eher verwirrend :wink: )

(1)Bisher sendest du einzelne Zeilen an den Arduino, der sie zur csv Datei hinzufügt ?
(2)Ausserdem sendet der Arduino die komplette Datei an die GUI ?
Jetzt fehlt dir noch, dass die GUI eine komplette Datei an den Arduino sendet ?

Wäre sowas möglich, und wie ?

Ja, klar :wink:
Wenn ich das oben richtig verstanden habe, musst du nur erkennen, ob das was kommt eine zusätzliche Zeile ist, oder der Beginn einer ganzen Datei.

Wie wäre es z.B. mit einem Clear - Kommando vorweg ?
Danach kommen mehrere Zeilen, die an die dann leere Datei angefügt werden, mit Methode (1)

ja also bisher sende ich immer nur zeilen an den arduino, der sie einfach an die csv.datei dranhängt. Doch ich kann mit dem arduino den kompletten dateiinhalt der csv.datei an die gui senden.
Nun möchte ich , wie du sagtest in punkt 3 , jedesmal wenn ich den Save to SD button betätige(siehe neue skizze im anhang), den kompletten Listbox inhalt in die csv.Datei schreiben bzw. den alten Dateiinhalt mit dem neuen (aus listbox) überschreiben.
Habe jetzt in der zeit vieles versucht, och es klappt nicht.

Also dachte es mir so, ich sende zeilenweise die einträge meiner listbox an dem arduino und er schriebt sie zeilenweise in die csv.datei rein, bis nichts ankommt. falls eine csv.datei vorhanden ist, wird diese gelöscht und die datei neu erstellt(überschrieben). Also das zeilenweise senden von der GUI aus habe ich hinbekommen, doch von seitens des Arduinos komme ich nicht mehr weiter(also bzw der arduino teil mit dem empfangen der zeilen und diese verarbeiten fehlt mir bzw kriege ich nciht hin.

Das ist mein VB-Code dazu:

For Each ListItem As String In listbox_i2c_editparameter.Items
                parameter = ListItem
                SerialPort_i2c.Write(parameter)
                SerialPort_i2c.Write(Environment.NewLine)
            Next
            MsgBox("Parameterlist was saved in I2C.csv")

Hier der Arduino teil, der mir aber nur eine zeile an die csv datei dranhängt, kannst du mir bitte helfen dass so umzustellen, dass ich den kompletten inhalt der Listbox in die SD karte schreibe (alte Datei überschreiben)? -> komme einfach nicht mehr weiter :frowning: und weiß nicht mehr wie ich dass codemäßig umsetzen soll :frowning:

Arduino code:

void write_SD()
{
        if (Serial.available()>0)
        {
          
          if (inByte ==13) //enter
          {
            Serial.println("Initializing SD Card...");
              if (!SD.begin(chipSelect))
              {
                Serial.println("Initialization failed");
                return; //tue nichts
              }//endif
               Serial.println("SD Card initialized");
                if (SD.exists("test2.csv"))
                {
                  Serial.println("File exists");
                }
                else
                {
                 Datei=SD.open("test2.csv", O_CREAT | O_WRITE);
                 Datei.println("Anz_Parameter;Adresse;Register;Data");
                 Datei.close();
                }
  
           //Schreibzugriff
           Datei= SD.open("test2.csv", O_CREAT | O_WRITE); //Das gleiche wie FILE_WRITE. doch es beschleunigt das Schrieben auf SD 
           //Datei=SD.open("test2.txt", FILE_WRITE);
          //falls Datei ok, schreibe 
          if (Datei)
          {
            //delay(150); //verzögerung, da schreiben auf SD karte langsamer ist
             //Datei.write(Test); //ohne zeilenumbruch
             //Datei.write(13); //schreibe nach jedem eintrag ein carriage return line feed, damit strings zeilenweise einetragen werden  
             Datei.print(Text);
             Datei.println(); //Damit er in neue zeile schreibt
              //inhalt von Array Text in SD schreiben(commands.txt)-> println mit zeilenumbruch
             Datei.close(); //Damit änderung gespeichert werden, diese Datei schliessen
             Serial.println("Data stored in SD card"); 
            /*Nachdem enter gekommen ist und daten gespeichert wurden
            setze Array wieder auf 0 und lösche inhalt*/
            index=0;  //index auf 0 initialisieren
            memset(&Text[0], 0, sizeof(Text)); //durch memset wird Array gelöscht 
            Serial.println("Array initialized");
         }//endif datei vorhanden?
       }//endif kontroll enter
          else//fals kein enter,soll weiter in array speichern
          {
            if (index <400)//schauen , ob array overflow hat //vorher 400
            {
              
              Text[index]=inByte; //solange kein ´Enter vom Arduino empfangen wird, schreibe in Array
              index++; //und zähle position hoch -> z.b. wenn ich hallo sende-> jeder buchstabe bekommt eine position
              delay(100);
            }//endif check array of overfolw
          }//end else
        }//endif serial available
}//end fu

Anbei noch die Skizze , wie ich das realisieren möchte und danke wirklich .

michael_x:
Vermutlich verstehe ich dein Problem nicht.
( Das Bild ist jedenfalls eher verwirrend :wink: )

(1)Bisher sendest du einzelne Zeilen an den Arduino, der sie zur csv Datei hinzufügt ?
(2)Ausserdem sendet der Arduino die komplette Datei an die GUI ?
Jetzt fehlt dir noch, dass die GUI eine komplette Datei an den Arduino sendet ?

Wäre sowas möglich, und wie ?

Ja, klar :wink:
Wenn ich das oben richtig verstanden habe, musst du nur erkennen, ob das was kommt eine zusätzliche Zeile ist, oder der Beginn einer ganzen Datei.

Wie wäre es z.B. mit einem Clear - Kommando vorweg ?
Danach kommen mehrere Zeilen, die an die dann leere Datei angefügt werden, mit Methode (1)

So nun bin ein Schritt weitergekommen und um den ganzen inhalt von der lIstbox in die SD zu schrieben sende ich es zeilenweise von meiner gui und nach jeder zeile sende ich einen Enter(vbCr) damit markiert wird, eine parameterzeile ist fertig.
Der arduino liest so lange bis etwas vom Seriport kommt und lädt die zeichen bis ein Enter kommt in den buffer. Sobald ein enter kommt, weiß der arduino, eine zeile ist fertig und schriebt diese in die SD karte und initialisert den BUffer für die nächstkommende Zeile.
Wichtig bevor ich diese FUnktion write_SD aufrufe, prüfe ich, ob die datei vorhanden ist, wenn ja wird sie gelöscht und die gleiche neuerstellt und der inhalt zeilenweise geladen, wenn Datei nicht da ist, wird sie erstellt und der inhalt geladen

Das Problem es funktioniert nicht, bekomme keinen Inhalt in die Parameter nicht in die SD karte kann mir da jemand helfen?

BITTE BITTE , brauche hilfe

Arduino Code dazu:

if(!SD.begin(chipSelect))
        {
          Serial.println("No SD-card");
          return;
        }//end if Sd.begin
        Serial.println("SD-card ok");
        //-----------überprüfen Datei da---------------------//
        // wenn ja= löscheu nd erstelle eine neue ,sonst//
        //wenn keine da, erstelle neue Datei//
          if(SD.exists("I2C.csv"))
          {
            SD.remove("I2C.csv");
            Datei=SD.open("I2C.csv",O_CREAT | O_WRITE);
            Datei.println("Anz_para | Address | Register | Data |");
            Datei.close();
            write_SD();
          }//sd exists
          //falls Datei nicht vorhanden erstelle neue Datei
          else
          {
            Datei=SD.open("I2C.csv",O_CREAT | O_WRITE);
            Datei.println("Anz_para | Address | Register | Data |");
            Datei.close();
            write_SD();
          }//end else
        
        

     }

void write_SD()
{
  //wiederhole die schleife,solange ein Zeichen an Serialport anliegt
  //und Buffer nicht überschritten wird
  
  while((Serial.available()) & (index <500)) 
  {
    inByte = Serial.read();// lese aktuelles Zeichen ein
    //wenn kein enter kommt dann schriebe solange in Buffer,somit parameterzeile nicht vollständig
    if(inByte !=13) 
    {
      Text[index]=inByte;
      Serial.println("array vor enter");
      Serial.print(Text);
      index++;//und indexposition erhöhen
    }//end if !=13
    //falls Enter ankkommt schreibe bufferinhalt in sd und init buffer für nächsten wert
    else
    {
      Datei=SD.open("I2C.csv",O_CREAT | O_WRITE);
      Serial.println("Beim enter");
      Serial.print(Text);
      Datei.print(Text); 
      Datei.println();
      //close datei, damit inhalt gespeichert wird.
      Datei.close();
      Serial.println("Stored");
      //init Buffer
      index=0;
      memset(&Text[0],0,sizeof(Text));//lösche inhalt
      Serial.println("NAch init");
      Serial.print(Text);
    }//end else
    
    //falls Bufferüberläuft setze ihn zurück 
    if(index==500)
    {
      Serial.println("Array overflow");
      index=0;
      memset(&Text[0],0,sizeof(Text));
    }//end if overflow
  }//end while

Das ist mein VB-code:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_saveToSD.Click
        Try
            For Each ListItem As String In listbox_i2c_editparameter.Items
                parameter = ListItem
                SerialPort_i2c.Write(parameter)
                SerialPort_i2c.Write(vbCr)
            Next
            MsgBox("Parameterlist was saved in I2C.csv")

KANN MIR BITTE JEMAND HELFEN?

Habs nicht komplett angesehen, aber gleich eine der Lieblingsgemeinheiten von c - Compilern gesehen,
beides ist "richtig":

  while((Serial.available()) & (index <500))  // funktioniert nicht, wenn available eine gerade Anzahl liefert !!!

  while((Serial.available()) && (index <500)) // ein anderes AND , [Nachtrag:] und meist das was man haben will ;)

ok also ich komme einfachn icht weiter, sende zb. 3;4;5;6 als eine zeile und bekomme in die Datei nur folgendes eingetragen ; 56 ohne ; obwohl das als kompletten String gesendet wird. Woran kann das hängen. wenn ich nochmals die listbox aktualisieren und den inhalt sende, geht es nicht. woran liegt das? Bin am verzweifeln :frowning:

Ohne die vorige [b]&&[/b] - Korrektur geht zwar nicht jedes zweite Zeichen verloren, sondern wird nur später bearbeitet ...

Leider sehe ich die Definiton von Text nicht, so muss ich annehmen, dass es zwar ein

char Text[500]; // bisschen groß für 1 Zeile ...

ist, aber zumindest beim ersten Versuch evtl. keine Ende-Kennung drin ist.
Allerdings sehe ich nicht, dass du irgendein Zeichen ausser CR (13) anders behandelst, so weiss ich nicht, wie dieses ';' zwischen 2 Zahlen verschwinden können sollte. Oder verschwindet doch jedes 2. Zeichen ???

Vielleicht postest du mal die Serial Testausgaben? Evtl. fällt ja jemandem was auf...

Hi ja das ist ein char Text[500] das war nur der dfür wichtige codeausshnitt. EIne frage ist die, warum ging mit dem & jedes zweite Zeichen weg und mit dem && nicht? was ist der unterschied?
ne es verschiwndet nicht jedes 2 zeichen doch die ; verschiwnden und das verstehe ich nicht?
Gibt es vllt eine andere Möglichkeit, den kompletten inhalt der Listbox an dem Arduino zu senden damit er diesen mit dem alten Inhalt der SD karte überschriebt? Bin so langsam am verzweifeln, vllt einen anderen weg?

Also was ich miene ist den kompletten inhalt der GUI an die SD karte zu schreiben.

Gibt es da vllt einen anderen WEG?

& = bitweises Und
&& = logisches Und

Bei & macht er eine bitweise Verknüpfung der beiden Variablen und wertet danach auf true oder false aus. Mit && werden die Bedingungen jeweils auf true oder false überprüft und dann miteinander verknüpft.

Und da 0 = false und 1 = true...

Ah ok dankeschön, also habe folgende parameterzeile gesendet(3;1;0;0) und habe folgende ausgabe-> ;;0;;0;;;0;;1;0;0

Ich weiß echt nicht mehr weiter :frowning:
Weiß jemand woran es leigen kann?

Weiß jemand woran es leigen kann?

Ich jedenfalls nicht ...

Vielleicht postest du mal die Serial Testausgaben?

... mit den "array vor enter" Zeilen ...

Vielleicht ist der RAM zu klein ... nimm mal static char Text[ 50 ];

also habe folgende Listbox einträge gesendet:
2;0;1
2;0;0

und die ausgabe von array vor enter sieht wie folgt aus:

array vor enter
;
array vor enter
;0
array vor enter
;0;
array vor enter
,0;1
array vor enter
;0;1
;0;1
array vor enter
2
array vor enter
2;
array vor enter
2;0;
array vor enter
2;0;0
array vor enter
2;0;0

also gibt es eine andere möglichkeit, wie ich den kompletten listbox eintrag meiner gui auf die sd speichern kann?8das war punkt 3 was du gemint hattest)?
Komme nicht weiter, brauche eine lösung :frowning:

???

Probier mal statt
if(inByte !=13)

if(inByte !='\n') // newline (10) != CR (13)

ok werde ich probieren danke :smiley: