Как получить свободное/использованное место на SD-карте и передать его
Я использую этот блок кода для чтения и суммирования байтов всех текстовых файлов, которые у меня есть на SD-карте:
long get_sd_memory_taken() {
File dir = SD.open("/");
long sd_memory_taken;
int c = 0;
while (true) {
File entry = dir.openNextFile();
if (!entry) {
return sd_memory_taken;
break;
}
if(strcmp(entry.name(), "SYSTEM~1") == 0) {
continue;
}
if(c > 15) {
tft.println(entry.name());
tft.println(entry.size());
}
sd_memory_taken += entry.size();
entry.close();
c++;
}
}
SD-карта 8 ГБ, поэтому число не будет больше, чем 8,589,934,592. Функция get_sd_memory_taken() возвращает номер, чтобы его можно было отправить на телефон с помощью Bluetooth. Я только что проверил, что long может удерживать максимум 2,147,483,647, поэтому, если SD-карта заполнена больше, чем это, я предполагаю, что появятся ошибки. Как я могу предотвратить это? Я подумывал о том, чтобы использовать двойник, поставить запятую, может быть, на 5 цифр левее и отправить ее, а может быть, разделить число на 10 меньших длинных и отправить их на телефон отдельно. Я думаю, что первый метод лучше, но я не уверен, что он сработает. Как лучше всего решить эту проблему, когда я пытаюсь использовать как можно меньше памяти?
@JingleBells, 👍1
Обсуждение1 ответ
Как SD.h включает в себя
#include "utility/SdFat.h"
#include "utility/SdFatUtil.h"
или, если вы используете библиотеку SdFat, эта функция более эффективна, чем повторение повсюду:
#include <SdFat.h>
SdFat SD;
void ShowFreeSpace() {
// Рассчитать свободное пространство (кластеры без объема * блоки на кластеры / 2)
long lFreeKB = SD.vol()->freeClusterCount();
lFreeKB *= SD.vol()->blocksPerCluster()/2;
// Отобразить свободное место
Serial.print("Free space: ");
Serial.print(lFreeKB);
Serial.println(" KB");
}
Я не использую SdFat.h, так как он занимает больше места в программе, чем обычный SD.h, @JingleBells
Я только что заметил, что SD.h также может получить .clusterCount() и .blocksPerCluster(). Это сработает?, @JingleBells
Да, конечно -> Я думаю, вам на самом деле стоит заглянуть в SD.h угадайте, что я там нашел #включить "утилита/SdFat.h" #включить "утилита/SdFatUtil.h", так что да, это работает, @Codebreaker007
Пожалуйста, отметьте ответ как принятый, чтобы закрыть его и помочь другим найти решение. Спасибо за обратную связь, @Codebreaker007
- Вывод данных , ds18b20 , lcd1602 , yl-69, dht11
- C++ против языка Arduino?
- ошибка: ожидаемое первичное выражение перед токеном ','
- Ввести идентификатор чипа ESP32 в строковую переменную (новичок в Arduino/C++)
- Передача функции-члена класса в качестве аргумента
- Улучшенное циклическое переключение цветов RGB.
- Какие есть другие IDE для Arduino?
- Несовместимые типы при назначении «uint8_t {aka unsigned char}» на «uint8_t [1] {aka unsigned char [1]}»
Какой Arduino (и SD lib) вы используете?, @Codebreaker007
unsigned long long
akauint64_t
может содержать до 9,223,372,036,854,775,807., @Majenko@Codebreaker007 Синяя таблетка, SD.h, @JingleBells
@Majenko Я попробую это сделать, надеюсь, это самый эффективный способ сделать это с помощью памяти, @JingleBells
8 байт-это все, что используется. Тот же двойник., @Majenko
для многих плат arduino значение double равно 32 битам (синоним float). просто имейте в виду, если вы столкнетесь с этим здесь, работая с другой платой., @Abel