Arduino записывает файл на SD, но не содержимое файла

Я использую Arduino UNO, Extended Database Library (EDB) и карту microSD для чтения/записи 2 таблиц базы данных. Мне удалось создать оба файла ".db" на SD (они отображаются в Finder, когда я загружаю microSD непосредственно на свой Mac).

Я также могу заполнить их данными-заполнителями, но эти данные, похоже, на самом деле не записываются в файл (и, следовательно, не сохраняются после перезагрузки).

Кроме того, попытка dbFile = SD.open(db_name1, FILE_WRITE); возвращает false, даже если файлы существуют на диске?

Вот мой код создания:

#include <SPI.h>
#include <SD.h>
#define SD_PIN 10  //SD-контакт для чтения/записи
#define TABLE_SIZE 8192  //256*32
#include "Arduino.h"
#include <EDB.h>

char* db_name1 = "/DB/SENSOR1.db";
char* db_name2 = "/DB/SENSOR2.db";
File dbFile;

struct sensorLog1 {
  unsigned int id;
  float input;
  unsigned int timestamp;    
}
sensorLog1;
struct sensorLog2 {
  unsigned int id;
  float input;
  unsigned int timestamp;    
}
sensorLog2;

// Настройка объекта EDB
inline void writer (unsigned long address, const byte* data, unsigned int recsize) {
  dbFile.seek(address);
  dbFile.write(data,recsize);
  dbFile.flush();
}
inline void reader (unsigned long address, byte* data, unsigned int recsize) {
    dbFile.seek(address);
    dbFile.read(data,recsize);
}
// Создать объект EDB с соответствующими обработчиками записи и чтения
EDB db(&writer, &reader);


void setup() {

  Serial.begin(9600);

  createDB(db_name1, "sensorLog1");    
  createDB(db_name2, "sensorLog2");

  dbFile = SD.open(db_name1, FILE_WRITE);  // Не работает!
  if (!dbFile) { Serial.println("File does not exist"); }

}


void loop() {} 


void createDB(char* db_name, char* table_name) {

  // создать файл
  dbFile = SD.open(db_name, FILE_WRITE);
  db.create(0, TABLE_SIZE, (unsigned int)sizeof(table_name));

  // заполнить данными-заполнителями
  for (unsigned int i = 1; i <= 20; i++) {
    table_name.id = i;
    table_name.input = 0;
    table_name.timestamp = 0;
    EDB_Status result = db.appendRec(EDB_REC table_name);
  }

  // проверка данных
  Serial.println(db.count());  // возвращает '20'

  // закрыть файл для записи
  dbFile.close();

}

, 👍0


1 ответ


1

db.create(0, TABLE_SIZE, (беззнаковое целое)sizeof(имя_таблицы));

Третий параметр — размер записи! sizeof работает не с данными, а с типами, поэтому вы получаете размер char* вместо размера вашей структуры sensorlogN.

Ваш код в том виде, в котором он написан, не должен компилироваться! У char* нет члена .id.

table_name.id = i;
table_name.input = 0;
table_name.timestamp = 0;
,