Имена файлов из модуля SD-карты Arduino в массив - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь сделать простой WAV-плеер, используя Arduino и модуль SD-карты, я только начал и уже столкнулся с некоторыми проблемами. Мне нужно получить все имена файлов из определенной папки на 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 голосов
/ 16 сентября 2018

У вас есть две проблемы в этой строке кода:

songList =(String*) malloc(nSongs);

Во-первых, вы не выделяете достаточно памяти, а во-вторых, вы получите неинициализированные String s.

Поскольку это C ++, самый простой способ исправить это - использовать new вместо malloc:

songList = new String[nSongs];
...