Произвольный доступ к SD-карте с помощью SD.h или другой библиотеки (ESP32)
Я пытаюсь использовать 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 или другой библиотеки?
Заранее спасибо!
1 ответ
Лучший ответ:
Решаемая!
Решение состояло в том, чтобы перейти из библиотеки 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
- Лучшая практика буферизации для непрерывной записи на SD-карту
- Как **получить** атрибуты для файлов SD?
- Функция библиотеки SD не работает при использовании второго порта SPI с ESP32
- Размер структуры tm (datetime) отличается в ESP32 от linux64x
- SD - карта создает "лишний" файл?
- Возврат в родительский каталог с библиотекой SD
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
Примечание: библиотека SD в пакете поддержки плат ESP32 отличается от стандартной библиотеки Arduino SD. , @Juraj
@Juraj Я попробовал, но получил тот же результат, первый
myFile.seek(3);
усекает файл раньше., @Alexandro Palacios