INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
15.02.2015, 12:30 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015 12:36 von HaWe.)
Beitrag #1
Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
hi,
unabhängig von den "Mega-Problemen" mit der SD Karte funktioniert sie ja immerhin auf dem Due.

Hier habe ich Fragen zum Gebrauch der lib:

Zunächst schreibe ich z.B. nacheinander zeilenweise (!) verschiedene Strings in die Datei:

Code:
if (myFile) {
    // if the file opened okay, write to it, then close file:
    sprintf(sbuf,"#: Writing string to %s ",fname);
    Serial.println(sbuf);
    
    // write data to file
    sprintf(sdata, "neu test string 1");
    myFile.println(sdata);
    sprintf(sdata, "neu test string 2");
    myFile.println(sdata);
    sprintf(sdata, "neu test string 3");
    myFile.println(sdata);
    sprintf(sdata, "ENDE");
    myFile.println(sdata);
    
    
    // close the file:
    myFile.close();
    sprintf(sbuf,"#: %s closed.   ",fname);
    Serial.println(sbuf);
  }

nun kann ich anschließend ja die gesamte Datei lesen:

Code:
myFile = SD.open(fname);
  if (myFile) {
    sprintf(sbuf,"#: reading %s ",fname);
    Serial.println(sbuf);

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();

ABER:
wie kann ich jetzt aber die Daten Zeilen-weise lesen?
myFile.readln() habe ich nicht finden können Huh
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.02.2015, 14:55 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015 14:56 von rkuehle.)
Beitrag #2
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
Beispiel:
Code:
char inputString [100]; // max. Zeilenlänge
char inputChar;
int stringIndex = 0;
while (myFile.available())
{
  inputChar = myFile.read();
  if (inputChar != '\n')
  {
    inputString[stringIndex] = inputChar;
    stringIndex++;
  }
  else
  //  stringIndex auf 0, Ausgabe
}
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.02.2015, 16:18 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015 17:33 von HaWe.)
Beitrag #3
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
ahaaa! danke, jetzt verstehe ich, es wird also der File-Inhalt sowieso byteweise gelesen, nicht irgendwie "geflusht"!
Dann muss man also zeilenweise in Byte-arrays schreiben und die dann in Variablenwerte decodieren.


Dazu jetzt die Anschlussfrage:
Gesetzt, ich speichere in einem String 2 int16_t und 2 32-bit float per

Code:
int32_t p,q;
float x,y;
sprintf(sdata, "%d%d%f%f", p,q,x,y);
myFile.println(sdata);

nun lese ich so eine Zeile wieder ein und erhalte wieder einen string
[ab'cd'efgh'ijkl'\n'] // 'Hochkommata nur zur Verdeutlichung - ggf. auch ohne '\n' am Schluss

Welche Sketch-Funktion kann ich nun verwenden, um in diesem Zeilen-array ints und floats korrekt zu dekodieren mit der richtigen Endianness?

Schön wäre natürlich stattdessen auch ein fgetf(), das wie scanf() funktioniert...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.02.2015, 17:33 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015 18:10 von HaWe.)
Beitrag #4
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
ich habe mal zur Simulation sprintf() mit scanf() verwendet, aber das ging ziemlich schief:

(edit, berichtigt):

Code:
void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(9600);
  
  int32_t p=33, q=66, m, n;
  
  float x=PI, y=987.654, v, w;
  char sdata[64], sbuf[64];
  
  Serial.println(p);
  Serial.println(q);
  Serial.println(x);
  Serial.println(y);
  
  sprintf(sdata,"%d%d%f%f",p,q, x,y);
  Serial.println(sdata);  // Originalstring ausgeben
  
  // sprintf(sbuf, "                ");   // dummy, macht aber keinen Unterschied
  int i=0;
  do  {
    sbuf[i]=sdata[i];
    ++i;
  }  while(sdata[i]!='\n');
  Serial.println(sbuf); // kopierten String ausgeben
  
  
  scanf (sbuf,"%d%d%f%f",&m, &n, &v, &w);
                        // Einzelwerte ausgeben
  Serial.println(m);
  Serial.println(n);
  Serial.println(v);
  Serial.println(w);
  

}

void loop() {
  // put your main code here, to run repeatedly:

}

Ausgabe:
Code:
33
66
3.14
987.65
33663.141593987.653992
33663.141593987.653992
2113363468
834414847
0.00
-0.00
die 5. und 6. Zeile sind der sdata und der sbuf string und bedeuten (ok):
Code:
33  66  3.141593   987.654
das mit dem scanf wird aber komplett falsch ausgewertet... Undecided

da ist wohl noch mächtig der Wurm drin...

Ergänzung:


auch wenn ich fest formatierte Stellen verwende, arbeitet scanf nicht korrekt:
Code:
void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(9600);
  
  int32_t p=33, q=66, m, n;
  
  float x=PI, y=987.654, v, w;
  char sdata[64], sbuf[64];
  
  Serial.println(p);
  Serial.println(q);
  Serial.println(x);
  Serial.println(y);
  
  sprintf(sdata,"%08d%08d%015.4f%015.4f",p,q, x,y);
  Serial.println(sdata);  // Originalstring ausgeben
  
  // sprintf(sbuf, "                ");   // dummy, macht aber keinen Unterschied
  int i=0;
  do  {
    sbuf[i]=sdata[i];
    ++i;
  }  while(sdata[i]!='\n');
  Serial.println(sbuf); // kopierten String ausgeben
  
  
  scanf (sbuf,"%08d%08d%015.5f%015.5f",&m, &n, &v, &w);
                        // Einzelwerte ausgeben
  Serial.println(m);
  Serial.println(n);
  Serial.println(v);
  Serial.println(w);
  

}

void loop() {
  // put your main code here, to run repeatedly:

}

ergibt:

Code:
33
66
3.14
987.65
00000033000000660000000003.14160000000987.6540
00000033000000660000000003.14160000000987.6540
16
24
0.00
0.00


was mache ich falsch?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.02.2015, 18:47
Beitrag #5
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
Zitat:Welche Sketch-Funktion kann ich nun verwenden, um in diesem Zeilen-array ints und floats korrekt zu dekodieren mit der richtigen Endianness?
Ich würde nicht den Output dekodieren, sondern den Input so kodieren, dass in der Zeile ausschliesslich char vorkommen.
Eventuell ist es dann noch sinnvoll Zahlenwerte in der Zeile mit speziellen Start-,Endekennzeichen zu versehen. Dann sie sich wahrscheinlich besser/einfacher verarbeiten.
Guck dir mal das Beispiuel an: http://www.arduinoforum.de/arduino-Threa...nem-Aufruf (soll aber keine Eigenwerbung sein Smile )
Es geht dabei zwar um ein LCD, da dein Anliegen jedoch für die Ausgabe die Print-Klasse benutzt, sollte das passen.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.02.2015, 18:56 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015 19:17 von HaWe.)
Beitrag #6
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
ja, danke, aber dein
dtostrf(floatzahl, floatlength, nks, rwert);

ist doch i.P. genau das gleiche wie mein
sprintf(sdata,"%15.4f", x);

in jedem Falle wird eine Floatzahl in die bytes eines strings kopiert, das klappt ja (Zeile 5+6).

was ich simulierten wollte, ist ja:
4 Zahlen in einen String schreiben (sdata)
dieser String wird dann in eine Datei geschrieben (hier übersprungen)
dann wird er wieder zeilenweise aus der Datei gelesen (=sbuf, hier durch umkopieren aus sdata simuliert)
und jetzt muss er in die einzelnen 4 Zahlen zurück-decodiert werden.

die (Rück-)decodierung ist das Problem: wie kannst du deine codierten byte-Werte im Ausgabe-String denn in floats zurück-decodieren, um anschließend mit ihnen wieder zu rechnen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.02.2015, 19:55
Beitrag #7
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
Yo, jetzt hab ich es ja kapiert Smile
um float zurück zu bekommen benutzt du am besten atof(), für int-Werte atoi().
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.02.2015, 20:54 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015 23:48 von HaWe.)
Beitrag #8
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
ok, danke,
leider muss ich dann die 2 int und die 2 float Werte einzeln lesen.

habe es jetzt so versucht,
die ersten beiden Wrte sind int, die werden falsch konverteirt -
die beiden folgenden Float-Werte dagegen richtig....

sehr seltsam:

Code:
/*
  SD card read/write

This example shows how to read and write data to and from an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4

created   Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

*/

#include <SPI.h>
#include <SD.h>

#define SD_CSpin 4

File myFile;
char fname[64];

char sbuf[64];
char sdata[128];
char cln[]="                    ";



void setup()
{
  pinMode(SD_CSpin, OUTPUT);  
  
  Serial.begin(9600);
  
  sprintf(sbuf,"#: SD Initializing...");
  Serial.println(sbuf);
  // CS is pin 4. It's set as an output by default.


  while(!SD.begin(SD_CSpin) ) {
    sprintf(sbuf,"#: ...SD init failed");
    Serial.println(sbuf);
    delay(1000);
  }
  
  sprintf(sbuf,"#: ...SD OK !          ");
  Serial.println(sbuf);

  sprintf(fname,"test.txt");
  
  if (SD.exists(fname) ) {
    sprintf(sbuf,"#: %s exists     ",fname);
    Serial.println(sbuf);
    sprintf(sbuf,"#: Removing %s      ",fname);
    Serial.println(sbuf);
    SD.remove("test.txt");
    // removed: success ?
    if (SD.exists(fname) ) {
       sprintf(sbuf,"#: %s  exists     ",fname);
       Serial.println(sbuf);  
    }
    else {
       sprintf(sbuf,"#: %s  N/A     ",fname);
       Serial.println(sbuf);
     }
  }
  
  
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  int16_t  p, i, cnt=0;
  float    x;
  
  myFile = SD.open(fname, FILE_WRITE);
  
  if (myFile) {
    // if the file opened okay, write to it, then close file:
    sprintf(sbuf,"#: Writing string to %s ",fname);
    Serial.println(sbuf);
    
    // write data to file
    sprintf(sdata, "%d",1);
    myFile.println(sdata);
    Serial.println(sdata);
    sprintf(sdata, "%d", 2);
    myFile.println(sdata);
    Serial.println(sdata);
    sprintf(sdata, "%f", PI);
    myFile.println(sdata);
    Serial.println(sdata);
    sprintf(sdata, "%f", 987.654);
    myFile.println(sdata);
    Serial.println(sdata);
        
    
    // close the file:
    myFile.close();
    sprintf(sbuf,"#: %s closed.   \n",fname);
    Serial.println(sbuf);
  }  
  else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);
    Serial.println(sbuf);
  }
  

  // re-open the file for reading:
  myFile = SD.open(fname);
  if (myFile) {
    sprintf(sbuf,"#: reading %s ",fname);
    Serial.println(sbuf);

    // read from the file until there's nothing else in it:
    i=0;
    cnt=1;
    strcpy(sdata, "");
    while (myFile.available()) {
      sdata[i]=myFile.read() ;
      if(sdata[i] == '\n')   {      // end of string: CR
         //sdata[i]  = '\0';          // Null-Terminierung ??    

         Serial.print(cnt); Serial.print(": ");
         Serial.print(sdata);       // Ausgabe als String
         if(cnt<3) {
           p=atoi(sdata);           // 1+2: Ausgabe als Integer Zahl
           Serial.println(p);  
         }
         else {
           x=atof(sdata);           // 3+4: Ausgabe als Float Zahl
           Serial.println(x);
         }
         ++cnt;
         i=0;
         strcpy(sdata, "");
      }
      else ++i;
    }
    // close the file:
    myFile.close();        
    sprintf(sbuf,"#: %s closed.   \n",fname);
    Serial.println(sbuf);
  } else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);
    Serial.println(sbuf);

  }
}

void loop()
{
  // nothing happens after setup
}

Ausgabe (kommentiert):
Code:
#: SD Initializing...
#: ...SD OK !          
#: test.txt exists    
#: Removing test.txt      
#: test.txt  N/A    
#: Writing string to test.txt
1
2
3.141593
987.654000
#: test.txt closed.  

#: reading test.txt
1: 1                     // 1. Wert: integer = 1 als String
.6540001                      // als Integer-Zahl !!!!!!!FALSCH !!!!!!!
2: 2                     // 2. Wert: integer = 2 als String
.6540002                      // als Integer-Zahl !!!!!!!FALSCH !!!!!!!
3: 3.141593              // 3. Wert: float = PI  als String
3.14                          // als Float-Zahl
4: 987.654000            // 4. Wert: float = 987.654  als String
987.65                        // als Float-Zahl
#: test.txt closed.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Daten Visualisieren MeisterQ 12 533 01.12.2016 19:36
Letzter Beitrag: MeisterQ
  Data Logger Daten auf SD Card schreiben Crichton 12 266 22.11.2016 18:32
Letzter Beitrag: Crichton
  No such file Brother Tak 3 93 21.11.2016 10:24
Letzter Beitrag: Brother Tak
  I2C Daten übertragen Gandalf 3 210 04.11.2016 13:20
Letzter Beitrag: hotsystems
  Zahl von SD-Card Modul einlesen und Var. zuweisen Nafetz 13 291 28.10.2016 10:12
Letzter Beitrag: hotsystems
  Daten über USB verarbeiten Felix91 10 318 12.10.2016 13:00
Letzter Beitrag: Tommy56
  Problem mit SD Card Library BennIY 4 186 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Can-Bus Shield ok, aber keine Daten Clubsport 38 1.531 01.09.2016 14:17
Letzter Beitrag: Clubsport
  Serial Monitor ASCII 1 schreiben BennIY 11 574 01.08.2016 16:42
Letzter Beitrag: Mathias
  Daten an mysql diode1990 24 1.296 31.07.2016 10:29
Letzter Beitrag: Gandalf

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste