ESP32 и создание экземпляра SD

Студент
Offline
Зарегистрирован: 15.10.2018

на mega2560 использовался код: 

#include <SD.h>
SDClass * mySD = NULL; // ссылка на объект сд карты

void setup() {
  mySD = new SDClass;
  if (mySD->begin(5)) delete mySD;  
}

void loop() {
}

на ESP32 выдаёт ошибку: error: 'SDClass' does not name a type

я понимаю что используется для компиляции другая библиотека, но вот как изменить код, чтобы заработало не хватает знаний. Используется создание объекта во время выполнения для возможности смены SD карты, создавать новый объект было проще всего. Если сможете чтото посоветовать, буду искренне благодарен.

 
b707
Offline
Зарегистрирован: 26.05.2017

Студент пишет:

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

открыть эту самую "другую библиотеку" и посмотреть, как там называется класс для СД-карты
Студент
Offline
Зарегистрирован: 15.10.2018

В файле SD.h, который компилируется с esp32 есть объявление: 

namespace fs
{

class SDFS : public FS
{
protected:
    uint8_t _pdrv;

public:
    SDFS(FSImplPtr impl);
    bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint="/sd", uint8_t max_files=5, bool format_if_empty=false);
    void end();
    sdcard_type_t cardType();
    uint64_t cardSize();
    uint64_t totalBytes();
    uint64_t usedBytes();
};

}

extern fs::SDFS SD;

using namespace fs;
typedef fs::File        SDFile;
typedef fs::SDFS        SDFileSystemClass;
#define SDFileSystem    SD

#endif /* _SD_H_ */ 

а вот как это применить как раз и не знаю, просто поменять SDClass на SDFS не работает, чтото я делаю не так.

b707
Offline
Зарегистрирован: 26.05.2017

Студент пишет:

просто поменять SDClass на SDFS не работает, чтото я делаю не так.

в чем выражается "не работает"?

Студент
Offline
Зарегистрирован: 15.10.2018

Выразился не корректно, не компилируется: 

#include <SD.h>
SDFS * mySD = NULL; // ссылка на объект сд карты

void setup() {
  mySD = new SDFS;
  if (mySD->begin(5)) delete mySD;  
}

void loop() {
}

Ошибки :

Arduino: 1.8.10 (Windows 10), Плата:"ESP32C3 Dev Module, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 160MHz (WiFi), QIO, 80MHz, 4MB (32Mb), 921600, None"

C:\Users\User\Documents\Arduino\sketch_mar16a\sketch_mar16a.ino: In function 'void setup()':
sketch_mar16a:5:14: error: no matching function for call to 'fs::SDFS::SDFS()'
   mySD = new SDFS;
              ^~~~
In file included from C:\Users\User\Documents\Arduino\sketch_mar16a\sketch_mar16a.ino:1:
C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.0-rc1\libraries\SD\src/SD.h:30:5: note: candidate: 'fs::SDFS::SDFS(fs::FSImplPtr)'
     SDFS(FSImplPtr impl);
     ^~~~
C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.0-rc1\libraries\SD\src/SD.h:30:5: note:   candidate expects 1 argument, 0 provided
C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.0-rc1\libraries\SD\src/SD.h:24:7: note: candidate: 'fs::SDFS::SDFS(const fs::SDFS&)'
 class SDFS : public FS
       ^~~~
C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.0-rc1\libraries\SD\src/SD.h:24:7: note:   candidate expects 1 argument, 0 provided
C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.0-rc1\libraries\SD\src/SD.h:24:7: note: candidate: 'fs::SDFS::SDFS(fs::SDFS&&)'
C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.0-rc1\libraries\SD\src/SD.h:24:7: note:   candidate expects 1 argument, 0 provided
Несколько библиотек найдено для "FS.h"
 Используется: C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.0-rc1\libraries\FS
Несколько библиотек найдено для "SPI.h"
 Используется: C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.0-rc1\libraries\SPI
Несколько библиотек найдено для "SD.h"
 Используется: C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.0-rc1\libraries\SD
Не используется: B:\Arduino\libraries\SD
exit status 1
no matching function for call to 'fs::SDFS::SDFS()'


 

b707
Offline
Зарегистрирован: 26.05.2017

посмотрите внимательнее на листинг класса в сообщении #2. Там нет конструктора SDFS() без параметров, о чем вам компилятор и пишет.

Студент
Offline
Зарегистрирован: 15.10.2018

Вот как раз суть проблемы, на что и не хватает знаний. Как переделать код под ESP32. Нужно передать конструктору какие то параметры, если конечно класс SDFS это именно тот класс.

В модуле SD.h объявление такое:

extern fs::SDFS SD; 

соответственно что передавать конструктору не понятно.

rkit
Offline
Зарегистрирован: 23.11.2016

Оказывается, надо читать весь код библиотеки а не только один заголовок. Кто бы мог подумать.

b707
Offline
Зарегистрирован: 26.05.2017

Студент пишет:

В модуле SD.h объявление такое:

extern fs::SDFS SD; 

соответственно что передавать конструктору не понятно.

это не при делах.

Смотрите на обьявление конструктора:

SDFS(FSImplPtr impl);

он требует передачи параметра FSImplPtr. Судя по имени, это должен быть указатель на класс, описывающий файловую систему на СД-карте. Посмотрите, какие в библиотеке описаны файлосистемы и выберите нужную

rkit прав, надо серьезно разбираться в библиотеке, с наскоку не получится

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Какие конкретно в этой библиотеке - не смотрел, лениво.

Могут быть: SPIFFS / FAT / FATFS