Как установить атрибуты для SD-файлов?

sd

Как установить атрибуты файла, например, дату создания, для файла, создаваемого на SD-карте?

, 👍3


2 ответа


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

8

Библиотека Arduino SDоснована на Github: greiman / SdFatУильяма Греймана.

Из SD-карты созданы атрибуты файла:

Базовая библиотека SD.h не устанавливает атрибуты. Вы заметили, что все имеет одну и ту же дату создания? У библиотеки нет никакого способа узнать, какая сегодня дата.

Однако вам необходимо использовать функцию обратного вызова. Следующая информация взята из даты и времени создания файла на SD-карте?:

Установите библиотеку SdFat - есть пример с именем Timestamp.ino, подробно описывающий, как это сделать ...

// после того, как ваш rtc настроен и работает, ваш код просто необходим:

void dateTime(uint16_t* date, uint16_t* time) {
  DateTime now = rtc.now();

  // возвращает дату с помощью макроса FAT_DATE для форматирования полей
  *date = FAT_DATE(now.year(), now.month(), now.day());

  // время возврата с помощью макроса FAT_TIME для форматирования полей
  *time = FAT_TIME(now.hour(), now.minute(), now.second());
}

// поместите это вне каких-либо функций, перед вашей "настройкой"

// Затем внутри вашего "цикла" или "настройки"

void loop(void)
{

  // Другой код, который делает вещи

  //поместите эту следующую строку * Прямо перед * любой открытой строкой файла:
  SdFile::dateTimeCallback(dateTime);
  dataFile = SD.open(datafilename, FILE_WRITE);

  // другой код, который делает вещи

}

Есть еще один способ добиться этого в скетче без необходимости преобразования в SdFat:

@donald0000 хочет, чтобы в поле Дата изменения отображалась фактическая отметка времени когда вы просматриваете файлы, присутствующие на карте, с помощью проводника Windows. Как говорит Билли Хо, функция обратного вызова - это способ сделать это. Вы действительно можете использовать эту функцию с SD.h, если вы не хотите конвертировать в СДФат. Вот пример функции в скетче. Обратите внимание на время, когда записывается метка времени изменения даты, это когда file.close() записывает фактические данные на карту памяти.

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

File file;  // тестовый файл
const uint8_t SD_CS = 10; // Выбор микросхемы SD
RTC_DS1307 RTC;  // определяет объект часов реального времени

 char timestamp[30];

//------------------------------------------------------------------------------
// обратный вызов для временных меток файлов
void dateTime(uint16_t* date, uint16_t* time) {
 DateTime now = RTC.now();
 sprintf(timestamp, "%02d:%02d:%02d %2d/%2d/%2d \n", now.hour(),now.minute(),now.second(),now.month(),now.day(),now.year()-2000);
 Serial.println("yy");
 Serial.println(timestamp);
 // возвращает дату с помощью макроса FAT_DATE для форматирования полей
 *date = FAT_DATE(now.year(), now.month(), now.day());

 // время возврата с помощью макроса FAT_TIME для форматирования полей
 *time = FAT_TIME(now.hour(), now.minute(), now.second());
}
//------------------------------------------------------------------------------
void setup() {

 Serial.begin(9600);
 Wire.begin();
 if (!RTC.begin()) {
   Serial.println("RTC failed");
   while(1);
 };
 // установить дату и время функции обратного вызова
 SdFile::dateTimeCallback(dateTime);

  DateTime now = RTC.now();
  sprintf(timestamp, "%02d:%02d:%02d %2d/%2d/%2d \n", now.hour(),now.minute(),now.second(),now.month(),now.day(),now.year()-2000);
  Serial.println("xx");
  Serial.println(timestamp);


 if (!SD.begin(SD_CS)) {
   Serial.println("SD.begin failed");
   while(1);
 }
 file = SD.open("TEST_SD.TXT", FILE_WRITE);
 file.println("Testing 1,2,3...");

 delay(5000);
 file.close();
 Serial.println("Done");
}
//------------------------------------------------------------------------------
void loop() {}
,

3

Проще говоря, FAT16 поддерживает только 1 дату, обычно измененную дату. FAT32 имеет (ограниченную) поддержку для 3 дат (но AFAIK нет библиотеки Arduino, которая поддерживает FAT32).

Даже тогда не все ОС даже поддерживают дату создания. Windows имеет 2 различные интерпретации в зависимости от приложения, Linux изначально поддерживает только дату изменения, хотя расширения обеспечивают поддержку большего количества дат.

,

последняя библиотека SDFAT поддерживает FAT32., @TDHofstetter