我正在尝试使用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
答案 0 :(得分:2)
这行代码中有两个问题:
songList =(String*) malloc(nSongs);
首先,您没有分配足够的内存,其次,您将得到未初始化的String
。
由于这是C ++,解决此问题的最简单方法是使用new
而不是malloc
:
songList = new String[nSongs];