Как считать список файлов SD карты в массив?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Добрый день.

Продолжаю изучать принципы программирования. Требуется вывести на экран список файлов SD карты. Пока что ничего не получается. Всё что удалсь считать, это параметры: размер и тип файловой системы. Не могу никак понять как именно происходит процесс считывания оглавления. Кто может - помогите!

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Вот что-то такое уже тут проскакивало: Функция возвращающая массив

Изучаю...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

А что - примеры в поставке уже отменили? Там есть про список файлов, пример называется listfiles.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DIYMan пишет:

А что - примеры в поставке уже отменили? Там есть про список файлов, пример называется listfiles.

Да у меня мозгов, примерно, как у ардуины оперативы. Не могу пока что в голове держать все переменные и их значения. Разбираюсь потихоньку...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Так начинайте по принципу "от простого к сложному", иначе - не взлететь. Как только освоите простое, поймёте от и до, что делает та или иная строчка кода - переходите на следующий уровень. Наивно было бы полагать, что сразу получится разобраться в большом количестве информации.

Все сначала мигают светодиодом ;)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DIYMan пишет:
Все сначала мигают светодиодом ;)

 Так светодиодом-то я уже, как раз, помигал. Проблема кроется гораздо глубже: вот в примере "listfiles", список файлов идёт в терминал каким-то потоком. А мне-то надо поштучно каждый отобразить и на экране причем. А я чот никак не могу из этого потока выловить нужные мне элементы.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Строчка 66 в примере listfiles:

Serial.print(entry.name());

печатаем имя. Далее, в строчке 73 идёт работа с файлом:

Serial.println(entry.size(), DEC);

Всё, что между строками 70 и 74 - относится к работе с файлом, посмотрите все методы File и будет щастье.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DIYMan пишет:

Строчка 66 в примере listfiles:

Serial.print(entry.name());

печатаем имя. Далее, в строчке 73 идёт работа с файлом:

Serial.println(entry.size(), DEC);

Всё, что между строками 70 и 74 - относится к работе с файлом, посмотрите все методы File и будет щастье.

Да, все верно, все верно... Счастье было так близко, но не все так просто. Раскрою некоторые "секреты".

Я взял (чего греха таить) из примера "listfiles"  алгоритм, описанный Вами выше, для вывода имен файлов, потому что там чуть больше букв чем в примере "Cardinfo", из которого пригодилось только считывание параметров SD. Однако методы работы с SD в обоих примерах отличаются и это меня сбивает с толку.

Дело в том, что я пока что могу очень поверхностно понимать смысл происходящего в тексте скетча и копируя строки из разных примеров,  лишь слежу за тем что бы хотя бы переменные были объявлены так же, как и в исходниках. Но я еще совершенно не понимаю принципа работы с некоторыми типами данных и так же туго у меня с возвращаемыми значениями типа: "entry.size()", в то время как это "entry" было объявлено как "File".

Не понятно что вообще пишется через точку? Или это присуще только типу данных "File"? И где про это всё можно прочитать... И что-то я вообще не вижу что бы "File" был в списке типов данных...

Понятно теперь над чем приходится ломать голову вместо того, что бы ломать ее над алгоритмом самой программы?

Вот такая проблема.

fogary
Offline
Зарегистрирован: 05.03.2016

Buzzer2010 пишет:

Не понятно что вообще пишется через точку? Или это присуще только типу данных "File"? И где про это всё можно прочитать... И что-то я вообще не вижу что бы "File" был в списке типов данных...

File - это класс, entry - экземпляр этого класса. Через точку Вы получаете доступ к публичным (public) свойствам и методам класса (в данном случае, size() - метод класса File, который возвращает размер файла). Читайте про классы C++.

vde69
Offline
Зарегистрирован: 10.01.2016

есть классический подход к программированияю в таких случаях

1. берешь и пишешь коментарии без кода на всю программу целиком, например:

// получим первый байт с датчика
// получим второй байт с датчика
// сложим получение байты число INT
// отправим получение число в параллельный порт

2. потом между строк добаляешь код...

 

да получается длинно, но зато и мысли в порядок приведешь и потом исправлять будет проще.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

fogary пишет:

Buzzer2010 пишет:

Не понятно что вообще пишется через точку? Или это присуще только типу данных "File"? И где про это всё можно прочитать... И что-то я вообще не вижу что бы "File" был в списке типов данных...

File - это класс, entry - экземпляр этого класса. Через точку Вы получаете доступ к публичным (public) свойствам и методам класса (в данном случае, size() - метод класса File, который возвращает размер файла). Читайте про классы C++.

Да, наверно просто так, хватая куски чужих программ - не получится писать свои.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

vde69 пишет:

есть классический подход к программированияю в таких случаях

1. берешь и пишешь коментарии без кода на всю программу целиком, например:

// получим первый байт с датчика
// получим второй байт с датчика
// сложим получение байты число INT
// отправим получение число в параллельный порт

2. потом между строк добаляешь код...

 

да получается длинно, но зато и мысли в порядок приведешь и потом исправлять будет проще.

Только до этого, еще надо выучить что писать между комментариями. Пойду изучать язык.

vde69
Offline
Зарегистрирован: 10.01.2016

Buzzer2010 пишет:

vde69 пишет:

есть классический подход к программированияю в таких случаях

1. берешь и пишешь коментарии без кода на всю программу целиком, например:

// получим первый байт с датчика
// получим второй байт с датчика
// сложим получение байты число INT
// отправим получение число в параллельный порт

2. потом между строк добаляешь код...

 

да получается длинно, но зато и мысли в порядок приведешь и потом исправлять будет проще.

Только до этого, еще надо выучить что писать между комментариями. Пойду изучать язык.

 

ты не понял фишку... пиши коменты не зная языка, в этом и есть смысл, а потом постепенно будешь заполнять пробелы кодом....

это считается классическим подходом для перехода на новый язык программирования. Я то-же так делал 4 месяца назад, и освоился менее чем за неделю с новым языком...

vde69
Offline
Зарегистрирован: 10.01.2016

vde69 пишет:

Я то-же так делал 4 месяца назад, и освоился менее чем за неделю с новым языком...

я 30 лет связан с программированием, использовал кучу разных языков (и лисп и паскаль и 1с) но вот с++ не было ни разу.... для ардуинки я освоился (стал писать не глядя в подсказки) менее чем за неделю используя описаный подход... он реально работает...

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

vde69 пишет:

Buzzer2010 пишет:

vde69 пишет:

есть классический подход к программированияю в таких случаях

1. берешь и пишешь коментарии без кода на всю программу целиком, например:

// получим первый байт с датчика
// получим второй байт с датчика
// сложим получение байты число INT
// отправим получение число в параллельный порт

2. потом между строк добаляешь код...

 

да получается длинно, но зато и мысли в порядок приведешь и потом исправлять будет проще.

Только до этого, еще надо выучить что писать между комментариями. Пойду изучать язык.

 

ты не понял фишку... пиши коменты не зная языка, в этом и есть смысл, а потом постепенно будешь заполнять пробелы кодом....

это считается классическим подходом для перехода на новый язык программирования. Я то-же так делал 4 месяца назад, и освоился менее чем за неделю с новым языком...

Фишка еще и в том, что чем дальше я пытаюсь разобраться в языке, тем дальше отодвигается горизонт. Другими словами - чем больше узнаю, тем больше надо еще узнать. Это цепная реакция и я сейчас уже не так уверен как в начале пути.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

vde69 пишет:

ты не понял фишку... пиши коменты не зная языка, в этом и есть смысл, а потом постепенно будешь заполнять пробелы кодом....

это считается классическим подходом для перехода на новый язык программирования. Я то-же так делал 4 месяца назад, и освоился менее чем за неделю с новым языком...

Нет, сама идея мне понравилась - не забыть чего ты, на самом деле, добиваешься от программы ))) Это тоже важно. Возможно просто сейчас не самый подходящий момент.

vde69
Offline
Зарегистрирован: 10.01.2016

язык простой.... в нем разиратся 1 день... еще есть библиотеки, с ними сложнее ибо их много и документация не всегда удачная... но ГЛАВНАЯ проблемма - это разобратся со своей головой, что-бы понимать алгоритм работы программы еще до того как начать программировать....

например сейчас я для погодной станции написал целый эмулятор на компе и буду на нем прогонять различные алгоритмы, а когда четко пойму что и как делать - сделаю за пару дней :)

по этому - начни с приведения мысдлей в голове... поход когда коменты пишутся на всю программу целиком еще до начала непосредственого кодинга в этом очень помогает...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzzer2010 пишет:

чем дальше я пытаюсь разобраться в языке, тем дальше отодвигается горизонт. 

Ничего страшного, и ничего необычного - это общее свойство всех горизонтов.

Продолжайте работать и всё придёт.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

ЕвгенийП пишет:

Buzzer2010 пишет:

чем дальше я пытаюсь разобраться в языке, тем дальше отодвигается горизонт. 

Ничего страшного, и ничего необычного - это общее свойство всех горизонтов.

Продолжайте работать и всё придёт.

Спасибо за добрые слова, добрый человек, однако я на данном этапе уже серьезно задумываюсь над целесообразностью создания файлового менджера на ардуино. Задумка была именно такая. В принципе, когда файлов немного - ничего страшного и нет. Можно даже выпадающее меню сделать как в андроиде. Только кому придёт в голову с помощью ардуино наводить порядок на флешке с 10 файлами? Максимум что требуется делать с "SD.h": читать, писать, находить файл. А это и без вывода списка файлов на экран можно устроить...

Огорчает всё-таки то, что я так и не победил этот класс "FIle" и не смог вытащить из него список имён. Смысл происходящего для меня, пока что, за гранью. Но есть умная книга по Си. Так то поразмыслить будет над чем.

---------------------------------

Я конечно обо всём прочитаю, но всё-таки, вот в этом кусочке:

void printDirectory(File dir) {
  
  dir.rewindDirectory();
  
  while(true) {
     File entry =  dir.openNextFile();
     Serial.print(entry.name());
    }
}

Я понимаю так:

1. Объявляется класс "dir", которому выше передается значение "/", то есть - корневая папка.

2. dir.rewindDirectory() - это, я так понимаю, "перемотка" оглавления в начало

3. Далее следует цикл "while(true)" - "пока иситна", в котором объявляется еще один класс "File", в который считывается "dir.openNextFile()", несущий в себе как раз что я так долго искал: имя следующего файла "entry.name()", которое потом и выводится в терминал.

Этот вариант работает. Но вывести на экран "entry.name()" или переписать его в элемент массива, мне так и не удалось...

-------------------------------------

Непонятно вот что: откуда и как берутся эти ключевые слова через точку:

dir.openNextFile(), entry.name(), entry.size() ....

Это всё же где-то прописано? Возможно в библиотеке "SD.h" или "SD.cpp"...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Конечно, прописано. В описании класса File. Описание живёт в SD.h

Все названия функций, котрые Вы найдёте внутри описfния класса, 

class File : public Stream {
  private:
    char _name[13]; // our name
    SdFile *_file;  // underlying file pointer

  public:
    File(SdFile f, const char *name);     // wraps an underlying SdFile
    File(void);      // 'empty' constructor
    virtual size_t write(uint8_t);
    virtual size_t write(const uint8_t *buf, size_t size);
    virtual int read();
    virtual int peek();
    virtual int available();
    virtual void flush();
    int read(void *buf, uint16_t nbyte);
    boolean seek(uint32_t pos);
    uint32_t position();
    uint32_t size();
    void close();
    operator bool();
    char * name();

    boolean isDirectory(void);
    File openNextFile(uint8_t mode = O_RDONLY);
    void rewindDirectory(void);

    using Print::write;
};

это и есть методы, которыми Вы можете пользоваться (если они public)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Так... "class File : public Stream" это понятно. А что я делаю когда пишу: "void printDirectory(File dir)" ? Это тоже объявление класса "dir" ?

Или это просто переменная для класса "File", куда я буду считывать значения класса "File" ?

Вот например перменная "File entry" потом возвращает мне значение "entry.name()", где "entry" - это сама переменная, а "name()"  - это элемент класса "File" ? Я правильно понимаю?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сумбурно как-то всё.

Перейдите к нормальной терминогологии. Вы избегаете правильных терминов потому, что они Вас пугают а из-за этого говорите абсолютно непонятно.

Если у Вас книжка про С, то там про классы нет ничего.

Поэтому Вам надо либо оставить пока классы в покое и сосредоточиться на изучении С, либо взять книжку про С++ и читать про классы.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

ЕвгенийП пишет:

Сумбурно как-то всё.

Перейдите к нормальной терминогологии. Вы избегаете правильных терминов потому, что они Вас пугают а из-за этого говорите абсолютно непонятно.

Если у Вас книжка про С, то там про классы нет ничего.

Поэтому Вам надо либо оставить пока классы в покое и сосредоточиться на изучении С, либо взять книжку про С++ и читать про классы.

Я терминов не избегаю, а просто стараюсь не выглядеть полным идиотом, используя слова, значения которых мне неизвестны. Вот в чем дело.

Книжка у меня:  "Язык программирования Си", Брайан Керниган и Деннис Ритчи. 3-е издание.

Буду благодарен за ссылку на толковый учебник по С++.

Вот из этого, что посоветуете? Список

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ваша ссылка говорит "Resource is blocked".

Что до книги, ну возьмите Страуструпа.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

ЕвгенийП пишет:

Ваша ссылка говорит "Resource is blocked".

Что до книги, ну возьмите Страуструпа.

Спасибо. Буду стараться пытать ума у книг, чем отвлекать людей глупыми вопросами. Вот тот список:

Список книг:

Аверкин В.П., Бобровский А.И. и др. под ред. Хомоненко А.Д. Программирование на C++. Учебное пособие.Корона-Принт.1999.djvu
 Александреску. Современное проектирование на C++. Обобщенное программирование и прикладные шаблоны проектирования.Вильямс.2002.pdf
 Аммерааль Л. STL для программистов на C++.ДМК.1999.djvu
 Астахова И.Ф., Власов С.В. Язык С++. Учебное пособие. 2003.djvu
 Бондарев В.М. Програмирование на С++.2005.djvu
 Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. 2001.chm
 Вайнер, Пинсон. C++ Изнутри.2000.djvu
 Вандевурд, Джосаттис. Шаблоны C++. Справочник разработчика.Вильямс. 2003.djvu
 Глушаков, Коваль, Смирнов. Язык программирования С++, учебный курс. 2001.djvu
 Голуб А.И. Веревка достаточной длины, чтобы.. Правила программирования на C и C++. 2001.pdf
 Девис.С.Р. C++ для чайников.Диалектика.2003.pdf
 Дейтел Х, Дейтел П. Как программировать на C++. 1006с.djvu
 Джамса К. Учимся программировать на языке С++.Мир.1997.djvu
 Джордан Д. Обработка объектных баз данных в C++. Программирование с использованием стандарта ODMG.Вильямс.2001.djvu
 Джосьютис. C++ Стандартная библиотека. Питер.2004.djvu
 Каррано, Причард. Абстракция данных и решение задач на C++. Стены и зеркала.2003.pdf
 Кениг Э., Му Б. Эффективное программирование на С++.Вильямс.2002.djvu
 Крупник А. Изучаем C++. Питер.2004.djvu
 Крупник А. Самоучитель С++. Питер.2005.djvu
 Кубенский. Структуры и алгоритмы обработки данных, объектно-ориентированный подход и реализация на С++.БХВ.2004.djvu
 Культин Н. С С++ в задачах и примерах.БХВ.2005.pdf
 Лаптев. C++. Экспресс курс. БХВ.2004.rar
 Лафоре Р. Объектно-ориентированное программирование в С++.Питер.2004
 Либерти Дж. C++. Энциклопедия пользователя. 2001.djvu
 Либерти Дж. Освой самостоятельно C++ за 21 день. 2000.djvu
 Липпман. C++ для начинающих (1194s).pdf
 Магда Ю. Использование ассемблера для оптимизации программ на С++.БХВ.2004.djvu
 Марченко А.Л. C++ Бархатный путь.ГЛТ.2005.djvu
 Мейерс С. Наиболее эффективное использование C++. 35 новых рекомендаций.ДМК.2000.djvu
 Мейерс С. Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов. Питер-ДМК.2006.djvu
 Мейерс С. Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ.ДМК.2006.djvu
 Мейерс С. Эффективное использование STL.Питер.2002.djvu
 Мозговой М.В. С++ мастер-класс. 85 нетривиальных проектов, решений и задач.2007.djvu
 Оверленд Б. C++ без страха.2005.djvu
 Павловская Т. C C++ Программирование на языке высокого уровня.Питер.2003.pdf
 Павловская, Щупак. C C++. Структурное программирование - Практикум. Питер.2003.djvu
 Павловская, Щупак. C++. Объектно-ориентированное программирование - Практикум.Питер.2006.pdf
 Паппас К.Х., Мюррей У.Х. Отладка в C++. Руководство для разработчиков.Бином.2001.djvu
 Подбельский В.В. Язык Си++. 2003.djvu
 Пол А. Объектно-ориентированное программирование на С++.Бином.2001.djvu
 Прата С. Язык программирования C++. Лекции и упражнения. 2003.djvu
 Прата С. Язык программирования C++. Лекции и упражнения. DiaSoft.2005.djvu
 Рассохин Д. От СИ к СИ++.pdf
 Романов Е.Л. Практикум по программированию на C++.Уч. пособие. БХВ.2004.pdf
 Сабуров С. Языки программирования C и C++. Бук-Пресс.2006.pdf
 Савич У. Программирование на C++. Питер-БХВ.2004.pdf
 Саттер Г. Новые сложные задачи на C++. Вильямс.2005.djvu
 Саттер Г. Решение сложных задач на С++. Вильямс.2002.djvu
 Саттер, Александреску. Стандарты программирования на С++.101 правило и рекомендация.Вильямс.2005.chm
 Саттер, Александреску. Стандарты программирования на С++.101 правило и рекомендация.Вильямс.2005.pdf
 Седжвик Р. Фундаментальные алгоритмы на C++. Часть 1-4. DiaSoft.2001.djvu
 Седжвик Р. Фундаментальные алгоритмы на C++. Часть 5. Алгоритмы на графах. DiaSoft.2002.djv
 Секунов Н. Программирование на C++ в Linux. БХВ.2004.pdf
 Сик Дж., Ли Л., Ламсдэйн Э. C++ Boost Graph Library. Библиотека программиста. Питер.2006.pdf
 Скляров В.А. Язык С++ и объектно-ориентированное программирование. 1997.djvu
 Степанов А., Ли М. Руководство по стандартной библиотеке шаблонов (STL). 1999.chm
 Страуструп Б. Дизайн и Эволюция C++. 2006.djvu
 Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004.djvu
 Уилсон М. C++. Практический подход к решению проблем программирования (+ CD-ROM).2006
 Фленов М.Е. Программирование на C++ глазами хакера. БХВ.2004.chm
 Франка П. C++ Учебный курс. Питер.2003.rar
 Фридман, Кландер и др. C C++. Архив программ. Код с комментариями.Бином.2001.djvu
 Шилдт Г. C++ Руководство для начинающих. Вильямс.2005.djvu
 Шилдт Г. Искусство программирования на C++. БХВ.2005
 Шилдт Г. Самоучитель C++. БХВ.2003.djvu
 Штерн. В. Основы C++ Методы программной инженерии.Лори.2003.pdf
 Эккель, Эллисон. Философия C++. Практическое программирование. Питер.2004.djvu
 Эккель. Философия C++. Введение в стандартный C++. Питер.2004.djvu
 Элджер Дж. Библиотека программиста C++. 1999.pdf
 Якушев Д. Философия программирования на языке С++. Бук-пресс.2006.pdf