Pages: [1]   Go Down
Author Topic: Inhalt einer Listbox(von einer GUI ) in der SD karte mit arduino speichern  (Read 1239 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?



* split.png (43.96 KB, 1360x562 - viewed 38 times.)
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vermutlich verstehe ich dein Problem nicht.
( Das Bild ist jedenfalls eher verwirrend smiley-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 ?

Quote
Wäre sowas möglich, und wie ?
Ja, klar smiley-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)
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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:
Code:
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 smiley-sad und weiß nicht mehr wie ich dass codemäßig umsetzen soll smiley-sad

Arduino code:

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 .


Vermutlich verstehe ich dein Problem nicht.
( Das Bild ist jedenfalls eher verwirrend smiley-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 ?

Quote
Wäre sowas möglich, und wie ?
Ja, klar smiley-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)



* Unbenannt.png (17.95 KB, 1360x562 - viewed 33 times.)
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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:

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?


   
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
 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 ;)
« Last Edit: August 15, 2013, 06:29:57 am by michael_x » Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad
« Last Edit: August 15, 2013, 06:49:09 am by milito » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ohne die vorige && - 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
Code:
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...
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Faraday Member
**
Karma: 128
Posts: 4124
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

& = 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...
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad
Weiß jemand woran es leigen kann?
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Weiß jemand woran es leigen kann?
Ich jedenfalls nicht ...

Quote
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 ];
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

und die ausgabe von array vor enter sieht wie folgt aus:
Code:
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 smiley-sad
« Last Edit: August 16, 2013, 07:02:31 am by milito » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

???

Probier mal statt
if(inByte !=13)

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

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok werde ich probieren danke smiley-grin
Logged

Pages: [1]   Go Up
Jump to: