Произвольный доступ к SD-карте с помощью SD.h или другой библиотеки (ESP32)

esp32 sd sd.h

Я пытаюсь использовать SD-карту с моим ESP32, чтобы сохранить некоторые переменные в txt-файле. Каждая переменная использует 1 байт, поэтому они могут быть представлены 8-битным расширенным символом ASCII.

Проблема в том, что библиотека SD.h имеет только 3 открытых режима (только чтение, FILE_WRITE, FILE_APPEND), и я не могу понять, как использовать произвольный доступ для записи определенного байта файла.

Представьте себе ситуацию: у меня есть файл под названием myFile.txt который изначально имеет размер 5 байт, а его содержимое: abcde

Код, который я использую, выглядит следующим образом:

#include <SPI.h>
#include <SD.h>

#define SD_CS_PIN 5

File myFile;

void setup() {
  // Откройте последовательную связь и дождитесь открытия порта:
  Serial.begin(115200);
  while (!Serial) {
    ; // дождитесь подключения последовательного порта. Требуется только для родного USB-порта
  }


  Serial.println("Initializing SD card...");

  if (!SD.begin(SD_CS_PIN)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");



  myFile = SD.open("/myFile.txt", FILE_WRITE);
  myFile.seek(3);
  myFile.write('a');
  myFile.close();

}

void loop() {}

Но после запуска кода файл имеет неожиданное поведение, его размер изменяется с 5 байт до 4 байт, а содержимое: abca вместо ожидаемого abcae

Я знаю, что это происходит потому, что при записи в файл я использую открытый режим FILE_WRITE, который использует режим FILE_APPEND внутри, поэтому при выполнении myFile.seek(3);я усекаю файл до 4 байт, так как режим FILE_APPEND должен указывать на конец файла.

Итак, мой вопрос в том, как я могу открыть файл в режиме произвольного доступа с помощью SD.h или другой библиотеки?

Заранее спасибо!

, 👍4

Обсуждение

Примечание: библиотека SD в пакете поддержки плат ESP32 отличается от стандартной библиотеки Arduino SD. , @Juraj

@Juraj Я попробовал, но получил тот же результат, первый myFile.seek(3); усекает файл раньше., @Alexandro Palacios


1 ответ


Лучший ответ:

3

Решаемая!

Решение состояло в том, чтобы перейти из библиотеки SD в mySD, которая, по-видимому, является оболочкой SdFat для ESP32.

Вы можете видеть в файле mySD.h, что режим FILE_WRITE определяется следующим образом:

#define FILE_WRITE (F_READ | F_WRITE | F_CREAT)

Это означает, что он позволяет произвольный доступ к файлу для записи (F_WRITE вместо FILE_APPEND).

PS: Я хочу отметить комментарий @Juraj, так как форум в основном предназначен для вопросов платы Arduino

библиотека SD в пакете поддержки плат ESP32 отличается от стандартной библиотеки Arduino SD

,