Go Down

Topic: SDFat Library (Read 2 times) previous topic - next topic

michael_x

SdFat benutzt Sd2card ! ( Oder umgekehrt ? )
Das eine ist das Dateisystem, das andere die die SpeicherKarte selbst...

SdFat.begin() ruft Sd2Card.init() auf, und in einem SdFat Objekt ist auch ein Sd2Card Objekt enthalten. ( Fragt sich nur, ob du direkt drankommst, oder ob du die "Standard"-Bibliothek dafür wieder verbiegen musst ( irgendwas privates public machen oder so ) und ob das dir hilft..

Ausserdem gibt es noch File und SdFile, SdVolume und  evtl sind die bei LadyAda definierten Klassen andere als die von Sparkfun zum DataLogger empfohlenen. ...
Und es steht jedem frei, Erweiterungen einzubauen oder unnützen Ballast rauszuschmeissen ...

Ein Beispiel zeigt, was man direkt mit Sd2Card machen kann, das andere zeigt, wie du Dateien öffnest und liest oder schreibst.

Wenn ich mich recht entsinne, ist es nicht zu empfehlen, einfach zusätzlich zu dem in SDFat vorhandenen SD2Card Objekt ein zweites dazu zu definieren, vor allem wenn beide irgendwelche Veränderungen machen.

Aber seit ich einmal meine Funktionen ans Laufen gekriegt hab, habe ich mich nicht mehr näher für die Innereien von SDFat interessiert. Man kann eine Menge lernen ...  ;)




hk007

Hi,
danke für die geduldige Erklärung.
Hab jetzt noch ein paar Stunden gegoogelt und dann mit einem Codeschnipsel die Lösung für mein Problem gefunden.
Ich poste das mal hier. Evtl. hilfts mal jemand anderem:

Code: [Select]
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
SdFile myfile;     // das hier zusätzlich


// initialize SD-card
      if (!card.init(SPI_HALF_SPEED,4)) error("card.init failed!");
      // initialize a FAT volume
      if (!volume.init(&card)) error("vol.init failed!");
       
      Serial.print("Volume is FAT");
      Serial.println(volume.fatType(),DEC);
      Serial.println();
     
      if (!root.openRoot(&volume)) error("openRoot failed");
   
      // list file in root with date and size
      Serial.println("Files found in root:");
      root.ls(LS_DATE | LS_SIZE);
      Serial.println("Done");

und das hier zum Schreiben auf Fileebene

  if (myfile.open(&root,"test.csv", O_RDWR | O_CREAT | O_AT_END)) {
    myfile.print("test;1;2;3;4");
    myfile.close();
  }


Wenn mans weiss, dann ist es ganz einfach  :P
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

hk007

#7
Aug 06, 2012, 08:07 pm Last Edit: Aug 06, 2012, 08:32 pm by hk007 Reason: 1
Quote
Schreib SDFat.h und SDFat.cpp um !
Am einfachsten, indem du in deinem Sketch in dieser Reihenfolge
#define SDSERIALLOG Serial2  // Monitoring über "Serial-2"
#include <SdFat.h>
und dann  in SdFat.h
Code:
#ifndef SDSERIALLOG
#define SDSERIALLOG Serial
#endif
definierst, und danach in SDFile.cpp (oder überall) Serial durch SDSERIALLOG ersetzt.

Hi michael_x,

jetzt muss ich noch mal darauf zurückkommen:
Ich hab die Routine nicht in SDFile.cpp, sondern in SdFat.cpp gefunden. Ich bräuchte jetzt aber noch mal Hilfe von einem Profi.
Definiert ist die Routine so:
Code: [Select]
/** List the directory contents of the volume working directory to stdOut.
* \param[in] flags The inclusive OR of
* LS_DATE - %Print file modification date
* LS_SIZE - %Print file size.
* LS_R - Recursive list of subdirectories.
*/
void SdFat::ls(uint8_t flags) {
  vwd_.ls(stdOut_, flags);
}

und zu stdout finde ich am Anfang der SdFat-Library folgendes:
Code: [Select]
#if USE_SERIAL_FOR_STD_OUT || !defined(UDR0)
Print* SdFat::stdOut_ = &Serial;
#else  // USE_SERIAL_FOR_STD_OUT
class DefaultSerial : public Print {
public:
  size_t write(uint8_t b);
};
size_t DefaultSerial::write(uint8_t b) {
  while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) {}
  UDR0 = b;
  return 1;
}
//------------------------------------------------------------------------------
static DefaultSerial defaultStdOut;

Print* SdFat::stdOut_ = &defaultStdOut;
#endif  // USE_SERIAL_FOR_STD_OUT


Kann ich da irgendwas übergeben um die Ausgabe auf Serial2 umzuleiten?

Gruß/hk007

Edit:
ZU USE_SERIAL_FOR_STD_OUT hab ich noch das define in SdFatConfig.h gefunden:
Code: [Select]
/**
* Set nonzero to use Serial (the HardwareSerial class) for error messages
* and output from print functions like ls().
*
* If USE_SERIAL_FOR_STD_OUT is zero, a small non-interrupt driven class
* is used to output messages to serial port zero.  This allows an alternate
* Serial library like SerialPort to be used with SdFat.
*
* You can redirect stdOut with SdFat::setStdOut(Print* stream) and
* get the current stream with SdFat::stdOut().
*/
#define USE_SERIAL_FOR_STD_OUT 0

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

hk007

Hi,

jetzt bin ich aber stolz auf mich:
Es gibt in der SdFat Class folgende Funktion "SdFat::setStdOut (Print* stream)"
>>You can redirect stdOut with SdFat::setStdOut(Print* stream) and get the current stdOut stream with SdFat::stdOut().<<

Also folgende Zeile ins Programm:
Code: [Select]
SdFat::setStdOut(&Serial2);  // redirect Standardausgabe für SdFat

Und schon purzeln die Zeichen auf die Serial2.

gruß/hk007
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

michael_x

Ich zitiere mich gerne selbst:
Quote
Man kann eine Menge lernen ...  ;)


Herzlichen Glückwunsch !

Das macht auch mehr Spass als unverstandene Schnipsel zu kopieren.


Go Up