列出连接到Arduino的SD卡中存储的文件


正如标题所示,在本教程中,我们将列出连接到Arduino的SD卡中存储的文件。

电路图

电路图如下所示:

如您所见,您需要进行以下连接:

SD卡座Arduino Uno
Vcc5V
GNDGND
MISO12
MOSI11
SCK13
CS10

仅对于Vcc,请确保您的SD卡座接受5V输入。如果它接受3.3V输入,则将其连接到Arduino Uno上的3.3V引脚。

代码演练

我们将逐步讲解内置SD库附带的示例代码。您可以从文件→示例→SD→listfiles访问它。

或者,代码可以在GitHub上找到:https://github.com/adafruit/SD/blob/master/examples/listfiles/listfiles.ino 如您所见,我们首先包含库并声明根文件对象。

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

File root;

在setup中,我们初始化Serial,然后初始化SD。由于我们将SD卡的芯片选择引脚连接到Arduino Uno的10号引脚,因此我们将在SD.begin()中输入10作为参数。

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

   Serial.print("Initializing SD card...");

   if (!SD.begin(10)) {
      Serial.println("initialization failed!");
      while (1);
   }
Serial.println("initialization done.");

接下来,我们使用SD.open("/");打开SD卡的根目录,然后使用printDirectory()函数列出所有文件。我们稍后会介绍这个函数。

root = SD.open("/");

printDirectory(root, 0);

Serial.println("done!");
}

循环中没有执行任何操作。

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

现在,让我们来看一下printDirectory()函数。如您所见,这是一个递归函数。它接收两个参数:它必须扫描以查找文件的目录路径,以及在打印文件路径时必须添加到串行监视器的制表符数量。它的伪代码将类似于下面给出的伪代码:

  • 依次扫描根目录中的对象

  • 如果当前对象是文件,则打印其名称和大小

  • 如果当前对象是目录,则再次在此目录上调用printDirectory()函数,并增加一个制表符。这样,嵌套效果将在串行监视器上显示。

  • 当前目录中没有更多对象时,退出。

void printDirectory(File dir, int numTabs) {
   while (true) {

      File entry = dir.openNextFile();
      if (! entry) {
         // 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();
   }
}

更新于:2021年5月29日

4K+ 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告
© . All rights reserved.