Как получить свободное/использованное место на 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 меньших длинных и отправить их на телефон отдельно. Я думаю, что первый метод лучше, но я не уверен, что он сработает. Как лучше всего решить эту проблему, когда я пытаюсь использовать как можно меньше памяти?

, 👍1

Обсуждение

Какой Arduino (и SD lib) вы используете?, @Codebreaker007

unsigned long long aka uint64_t может содержать до 9,223,372,036,854,775,807., @Majenko

@Codebreaker007 Синяя таблетка, SD.h, @JingleBells

@Majenko Я попробую это сделать, надеюсь, это самый эффективный способ сделать это с помощью памяти, @JingleBells

8 байт-это все, что используется. Тот же двойник., @Majenko

для многих плат arduino значение double равно 32 битам (синоним float). просто имейте в виду, если вы столкнетесь с этим здесь, работая с другой платой., @Abel


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