列出連線到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.