从Arduino SD卡模块到阵列的文件名

时间:2018-09-16 11:47:14

标签: c++ arrays arduino sd-card

我正在尝试使用arduino和SD卡模块制作一个简单的wav播放器,我才刚刚起步并且已经遇到了一些问题。 我需要从SD卡中的特定文件夹中获取所有文件名,并将它们保存到阵列中。我的第一个问题是,我需要一个可以在运行时更改大小的数组。经过研究,我在代码上找到了这个解决方案,这是最好的方法吗? 其次,每当我运行代码时,我都会得到不同的输出,有时会出现一些歌曲名称,有时却不会。他们永远不会正确显示每个歌曲的名称。 第三,当歌曲名称出现时,它是不完整的。

我的文件夹结构是:

MUSIC/
    HakunaMatata1.wav
    HakunaMatata2.wav
    HakunaMatata3.wav
    HakunaMatata4.wav
    HakunaMatata5.wav
    HakunaMatata6.wav
    HakunaMatata7.wav
    HakunaMatata8.wav

我的串行输出如下:

Program started
SD initialization done.
Songs found:8
Songs List:
HAKUNA~1.WAV

HA1170~1.WAV
HA899A~1.WAV

最后,我的代码:

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

#define path "/music"
#define CSPin 53

String *songList;
File dir;
int nSongs = 0;


void setup() {
  Serial.begin(9600);
  while(!Serial){
  }

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

  dir = SD.open(path);
  listSongs(dir);
}

void loop() {
  // put your main code here, to run repeatedly:

}



void listSongs(File folder){
  nSongs = 0;

  while(true){
    File entry = folder.openNextFile();
    if(!entry){
      folder.rewindDirectory();
      break;
    }else{
    nSongs++;
    }   
    entry.close();
  }

  Serial.print("Songs found:");
  Serial.println(nSongs);

  songList =(String*) malloc(nSongs);

  Serial.println("Songs List:");

  for(int i = 0; i < nSongs; i++){
    File entry = folder.openNextFile();
    songList[i] = entry.name();
    entry.close();
    Serial.println(songList[i]);
  }
}

接线可能是正确的,因为SD卡已正确初始化,但这是:

SD CARD MODULE     ARDUINO MEGA
GND                GND
MISO               50
SCK                52
MOSI               51
CS                 53
5V                 5V

1 个答案:

答案 0 :(得分:2)

这行代码中有两个问题:

songList =(String*) malloc(nSongs);

首先,您没有分配足够的内存,其次,您将得到未初始化的String

由于这是C ++,解决此问题的最简单方法是使用new而不是malloc

songList = new String[nSongs];