listing files on arduino SD

2019-07-18 11:24发布

问题:

I have been trying to run Arduino file dump and directory listing examples together and hit a wall.

With the sketch below, if I attempt to dump a file (even if the file doesn't exist on the SD card) and then do a directory listing of the SD the sketch returns "** no more files **". I think this must be due to something being left open but for days have not been able to find where. Any help would be much appreciated.

Sketch:

#include <SD.h>

Sd2Card card;
SdVolume volume;
File root;
String inputString = "";
char FName[12];

const int chipSelect = 10;

void setup(){
  Serial.begin(9600);
  Serial.print("\nInitializing SD card...");
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed.");
  } else { Serial.println("SD Card OK"); }
  /*  if (!volume.init(card)) {
    Serial.println("No Partition Format SD"); return; }*/
}

void loop(void) {
  getSerialString();
  if (inputString == "id") {
    Serial.println("SD Card Test"); 
  } else {
    if (inputString == "fr") {
      Serial.println("File to Read");
      getSerialString();
      inputString.toCharArray(FName, inputString.length()+1);
      if (!dumpFile(FName)) {
        Serial.print("error opening "); 
        Serial.println(FName); 
      }
    } else {
      if (inputString == "dir" ) {
        File root = SD.open("/");
        if (root ) { 
          printDirectory(root, 0); 
          root.close();
        }
      }
    }
  }
  inputString = "";
}

boolean dumpFile(char fileNm[]) {
   File dataFile = SD.open(fileNm);
   if (dataFile) {    // if the file is available, read from it:
     while (dataFile.available()) { 
       Serial.write(dataFile.read()); 
     }
     dataFile.close();
   } else {dataFile.close(); return false; }
}

void printDirectory(File dir, int numTabs) {
  while(true) {
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       Serial.println("**no more files**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
       entry.close();
    }
  }
}

void getSerialString(void) {
  char inChar = ' '; inputString = "";
  // Serial.println("Waiting for User");
  while (inChar != 10) {
    while (Serial.available()) {
      inChar = Serial.read();     // get the new byte:
      if (inChar != 10) {         // add it to the inputString:
        inputString += inChar;
      }
    }
  }
}
标签: arduino