Go Down

Topic: Name aller Files auf der SD-Karte auslesen und abspeichern (Read 882 times) previous topic - next topic

kluepfel

Jul 09, 2013, 03:36 pm Last Edit: Jul 09, 2013, 04:00 pm by kluepfel Reason: 1
Hallo,
ich versuche zurzeit die Namen aller Files auf meiner SD-Karte auszulesen und abzuspeichern, am besten in char-Arrays.
Ich benutze einen Arduino MEGA2560 in kombination mit einem Ethernet-Shield.
Zum testen hab ich das Beispielprogram listfiles von der sd.h bibliothek verwendet und abgeändert.
Mein aktueller Sketch sieht wie folgt aus:


Code: [Select]
#include <SD.h>

File root;

void setup()
{
 // Open serial communications and wait for port to open:
 Serial.begin(9600);
  while (!Serial) {
   ; // wait for serial port to connect. Needed for Leonardo only
 }


 Serial.print("Initializing SD card...");
 pinMode(4, OUTPUT);
 if (!SD.begin(4)) {
   Serial.println("initialization failed!");
   return;
 }
 Serial.println("initialization done.");

 
 Serial.print("There are ");
 Serial.print(getNumberOfFiles());
 Serial.println(" Files saved on the sd-card");
 
 root = SD.open("/");
 printDirectory(root);
 
 Serial.println("done!");
}

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

void printDirectory(File dir) {
 int numberOfFiles = getNumberOfFiles();
 char fileNames[numberOfFiles][13];
 int x = 0;
 while(true) {
   
    File entry =  dir.openNextFile();
    if (! entry) {
      // no more files
      break;
    }

    if (!entry.isDirectory()) {
      fileNames[x] = entry.name(); // <-- Fehler!!
      Serial.print(fileNames[x]);
    }
    entry.close();
  }
}

//This function returns the number of files on the root-directory of a sd-card
int getNumberOfFiles()
{
 root = SD.open("/");
 int numberOfFiles = 0;
 while(true)
 {
   File entry = root.openNextFile();
   if(entry)
   {
     if(!entry.isDirectory())//if entry is a file
       numberOfFiles++;
   }
   else
     return(numberOfFiles);
   entry.close();  
 }
}


Die 12.Zeile der Funktion printDirectory() produziert folgenden Fehler:
incompatible types in assignment of '<unresolved overloaded function type>' to 'char[13]'

Die name()-Funktion der File Klasse ist wie folgt implementiert:
Code: [Select]
// returns a pointer to the file name
char *File::name(void) {
 return _name;
}


Diese Funktion gibt einen Zeiger auf den file namen zurück.
Deshalb habe ich einem char-Array diesen Rückgabewert zugewiesen, was aber nicht funktioniert.
Wie kann ich diesen Rückgabewert abspeichern?

Ich hoffe mir ihr könnt mir weiterhelfen.
Danke im vorraus

Serenifly

#1
Jul 09, 2013, 03:56 pm Last Edit: Jul 09, 2013, 04:17 pm by Serenifly Reason: 1
Versuchs mal mit stringcopy:
Code: [Select]
strcpy(fileNames[x], entry.name);

Alternative:
Code: [Select]
char* fileNames[numberOfFiles];

Dann sollte auch der Zuweisungs-Operator funktionieren. Aber strcpy ist in diesem Fall die beste und sicherste Wahl.

Der Grund ist dass bei mehr-dimensionalen Arrays der ganze Speicherbereich reserviert wird. Daher kannst du nicht nur einfach den Pointer auf das erste Element kopieren.

kluepfel

Vielen Dank für die schnelle Hilfe.
Mit
Code: [Select]
strcpy(fileNames[x], entry.name()); funktioniert es!

Go Up