Я пытаюсь написать программу, которая позволяет пользователям перемещаться по содержимому SD-карты с помощью кнопок на сенсорном экране (предположим, что существует только один уровень файлов; иначе папок нет). Тем не менее, я нахожу невозможным получить «список» всех файлов на SD-карте:
Я не могу просто создать массив strings
или же char*
потому что я не знаю номер
файлов на карте. Кроме того, я хочу, чтобы контейнер был динамическим, если
возможный.
Я не могу создать вектор, потому что Arduino не распознает std::vector
или же vector
даже когда у меня есть C ++ за Arduino.
Поиск в Google производит new
не существует в C ++ Arduino
Я мог бы использовать malloc
(или же new
), но это потребовало бы от меня создания собственного класса контейнера. Как бы это ни было интересно, цель того, что я делаю, — не реализовать динамический контейнерный класс.
Я что-то упустил в поиске такой функции?
Я рекомендую вам взглянуть на мой пример MP3-плеер и Веб-плеер.
Есть две проблемы:
1) Вам нужно подходить к этому с точки зрения оценки того, что Arduino не имеет достаточно ресурсов (SRAM) для хранения списка всех каталогов SdFAT. Поэтому мой подход состоял в том, чтобы использовать консоль пользователей для сохранения списка. Он выводит содержимое каталогов на консоль вместе с соответствующим номером. С которого пользователь может выбрать номер, который он хочет ввести. Точно так же Веб-плеер делает то же самое, но при генерации HTML он генерирует ссылку, указывающую на соответствующий элемент в списке. Следовательно, список хранится на консоли, являющейся либо браузером, либо последовательным монитором.
2) Предоставляемая по умолчанию библиотека SD недостаточна для того, что вы хотите. Недавно Ардуино соединился SdFatLib Билла Греймана как под капотом класс. Но ограничил это. Где использование родной библиотеки SdFat Билла позволяет вам использовать дополнительные методы для доступа к отдельным объектам, такие как getFilename()
, не доступно в SD. Это необходимо при просмотре каталога. sd.ls(LS_DATE | LS_SIZE)
будет только сбрасывать напрямую на серийный. Где вам нужно использовать доступ к отдельным файлам самим. Как показано ниже или в реальном коде
SdFile file;
char filename[13];
sd.chdir("/",true);
uint16_t count = 1;
while (file.openNext(sd.vwd(),O_READ))
{
file.getFilename(filename);
Serial.print(count);
Serial.print(F(": "));
Serial.println(filename);
count++;
}
file.close();
Кроме того, есть открытые методы, доступные по ссылкам, как показано в ListFiles WebPlayer () функция, чтобы получить более дискретную обработку файлов.
Других решений пока нет …