ЭБР. Можно ли создать несколько таблиц с помощью db.create()?
Добрый день! Кажется, у меня возникли проблемы с созданием нескольких таблиц с помощью EDB. Я использую Arduino UNO и модуль SD-карты для сохранения моей базы данных.
Вот мой серийный номер.
Вот мое объявление таблицы.
struct LogEvent {
int id;
String fname;
float temperature;
}
logEvent;
struct SecondEvent {
int id;
String lastname;
}
secondEvent;
Вот мой код db.create().
db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
db.create(0, TABLE_SIZE, (unsigned int)sizeof(secondEvent));
Теперь, когда я пытаюсь восстановить, это удар. Вот мой код сохранения и извлечения.
void createRecords(int num_recs, float correctTemperature)
{
Serial.print("Creating Records... ");
for (int recno = 1; recno <= num_recs; recno++)
{
correctId++;
logEvent.id = correctId;
logEvent.fname = "Brix Nicholson";
logEvent.temperature = correctTemperature;
secondEvent.id = correctId;
EDB_Status result = db.appendRec(EDB_REC logEvent);
if (result != EDB_OK) printError(result);
}
Serial.println("DONE");
}
void createRecordSecondEvent()
{
correctId++;
secondEvent.id = correctId;
secondEvent.lastname = "Secretaria";
EDB_Status result = db.appendRec(EDB_REC secondEvent);
if (result != EDB_OK) printError(result);
}
void selectLastRecord()
{
int lastRecNum = db.count();
EDB_Status result = db.readRec(lastRecNum, EDB_REC logEvent);
if(result == EDB_OK)
{
Serial.print(" ID: ");
Serial.print(logEvent.id);
Serial.print(" Name: ");
Serial.print(logEvent.fname);
Serial.print(" Temp: ");
Serial.println(logEvent.temperature);
}
else printError(result);
}
void selectLastSecondRecord()
{
int lastRecNum = db.count();
EDB_Status result = db.readRec(lastRecNum, EDB_REC secondEvent);
if(result == EDB_OK)
{
Serial.print("Second Event ID: ");
Serial.print(secondEvent.id);
Serial.print("Last Name: ");
Serial.print(secondEvent.lastname);
}
else printError(result);
}
@Xirb, 👍-1
Обсуждение2 ответа
Кажется, я нашел ответ на свою проблему. Я забыл увеличить адрес EDB_header.
Я написал:
db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
db.create(0, TABLE_SIZE, (unsigned int)sizeof(secondEvent));
Вместо:
db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
db.create(1, TABLE_SIZE, (unsigned int)sizeof(secondEvent));
Кажется, я нашел ответ на свою проблему. забыл увеличить адрес EDB_header.
вы правы насчет увеличения адреса EDB_header. Но адрес — это позиция, с которой библиотека начинает чтение/запись.
если вы посмотрите на https://github.com/jwhiddon/EDB/blob/master/EDB.cpp#L66 и https://github.com/jwhiddon/EDB/blob/master/EDB.cpp#L34
библиотека записывает фиксированный размер заголовка в двоичном формате который включает
- магический байт для распознавания заголовка EDB
- количество записей, присутствующих в данный момент в таблице, равное 0 на данный момент
- размер одной записи
- размер таблицы (максимальный объем памяти, который разрешено использовать таблице)
и написать новую запись https://github.com/jwhiddon/EDB/blob/master/EDB.cpp#L93
так в
db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
db.create(1, TABLE_SIZE, (unsigned int)sizeof(secondEvent));
второй оператор переопределит старый заголовок, за исключением первого байта (0-я позиция)
решение вашей проблемы будет
unsigned int FIRST_TABLE_HEADER_POSITION = 0;
db.create(FIRST_TABLE_HEADER_POSITION, FIRST_TABLE_SIZE, (unsigned int)sizeof(logEvent));
unsigned int SECOND_TABLE_HEADER_POSITION = FIRST_TABLE_HEADER_POSITION + (unsigned int)sizeof(EDB_Header) + FIRST_TABLE_SIZE;
db.create(SECOND_TABLE_HEADER_POSITION, SECOND_TABLE_SIZE, (unsigned int)sizeof(secondEvent));
теперь вы можете использовать
EDB_Status result = db.open(FIRST_TABLE_HEADER_POSITION );
и
db.close();
EDB_Status result = db.open(SECOND_TABLE_HEADER_POSITION );
- Конфликт между шилдом SD-карты и акселерометром
- Можно ли использовать Arduino для чтения и записи данных с помощью SD-карты?
- Мой Arduino Datalogging Shield не может прочитать SD-карту
- Как увеличить скорость записи на SD-карту в Ардуино
- SD-карта не инициализируется
- Что означают эти контакты? Куда мне их подключить?
- Понимание того, почему следует избегать «String» и альтернативных решений
- Arduino: как записать значение переменной в текстовый файл и изменить его на SD-карте?
Я пропустил адрес, теперь все в порядке. Спасибо!, @Xirb