esp32 чтение с SD, как работает библиотека?

Forza

✩✩✩✩✩✩✩
31 Июл 2018
6
0
Как я понял библиотека SD для ардуино не работает на esp, нужен FS.h функции которого к тому же должны находится в коде и действия с sd картой производить там же а это кучу флажков плодить для записи нескольких параллельных записей. Но это ладно, а как собственно работает чтение файла в формате символов? в консоль записи в текстовом файле выводить только как Serial.write(); а Serial.print() выводит не символы а цифры. А мне нужно файлы хранить в переменной String. Как работает чтение собственно в этой библиотеке
#include "FS.h"
#include "SD.h"
#include "SPI.h"
String gret;

int varTime;


void readFile(fs::FS &fs, const char * path){
Serial.printf("Reading file: %s\n", path);

File file = fs.open(path);
if(!file){
Serial.println("Failed to open file for reading");
return;
}

Serial.print("Read from file: ");
while(file.available()){
Serial.write(file.read());
Serial.println(file.read());
gret = file.read();
}
file.close();
}

void writeFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Writing file: %s\n", path);

File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("Failed to open file for writing");
return;
}
if(file.print(message)){
Serial.println("File written");
} else {
Serial.println("Write failed");
}
file.close();
}

void appendFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Appending to file: %s\n", path);

File file = fs.open(path, FILE_APPEND);
if(!file){
Serial.println("Failed to open file for appending");
return;
}
if(file.print(message)){
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}


void setup(){
Serial.begin(115200);
if(!SD.begin()){
Serial.println("Card Mount Failed");
return;
}
uint8_t cardType = SD.cardType();

if(cardType == CARD_NONE){
Serial.println("No SD card attached");
return;
}

Serial.print("SD Card Type: ");
if(cardType == CARD_MMC){
Serial.println("MMC");
} else if(cardType == CARD_SD){
Serial.println("SDSC");
} else if(cardType == CARD_SDHC){
Serial.println("SDHC");
} else {
Serial.println("UNKNOWN");
}

writeFile(SD, "/hello.txt", "Hello ");
appendFile(SD, "/hello.txt", "World!");
readFile(SD, "/hello.txt");

}

void loop(){
if(millis()-varTime > 2000){
// = readFile(SD, "/foo.txt");
Serial.println(gret);
varTime = millis();
}
}
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,067
915
. А мне нужно файлы хранить в переменной String.
вот уже эта фраза вызывает сомнение, что вы понимаете, что делаете. Записывать структуру String в файл - крайне неэффективно. Лучше хранить строки в виде С-строк(массивов символов).
А вообще файлы - это последовательность байт, которые вы потом в своей программе можете интерпретировать как угодно - числа, строки, массивы. Но писать на карту их проще и правильнее в виде байт.
 

Forza

✩✩✩✩✩✩✩
31 Июл 2018
6
0
Но писать на карту их проще и правильнее в виде байт.
Не спорю но у меня небольшой проект который пока что не требует скорости в плане работы но требует завершения к сроку, осталось у меня около недели что бы закончить, за неделю не успею разобраться с работой си строк и переделать проект под них. После как проект будет завершен я буду заниматься уже оптимизацией и развитием навыков а пока что нужно срочно найти способ хранить файлы на sd для чтения их с помощью ТГ бота.
 

bort707

★★★★★★✩
21 Сен 2020
3,067
915
Так в чем вопрос то?

Не заметил в первом вопросе кода, сорри.
Цикл while в процедуре readFile() вот так перепишите, остальное не трогайте. И покажите, что получится на выходе:
C++:
while(file.available()){
Serial.print(file.read(), HEX);
Serial.print(" ");
//gret = file.read();
}
 
Изменено: