Проблема массива символов EDB. Новое входное слово перекрывает предыдущие сохраненные слова
Теперь я искал повсюду, и, похоже, у меня ничего не получалось. Когда я пытаюсь ввести новое слово, оно перекрывает ранее введенные.
Вот мое определение структуры:
struct LogEvent{
char fullname[30];
} logEvent;
Вот как я присваиваю значение fullname:
strcpy(logEvent.fullname, testName);
Вот как я печатаю выходные данные:
for(int i = 0; i <= db.count(); i++)
{
EDB_Status result = db.readRec(i, EDB_REC logEvent);
if(result == EDB_OK)
{
Serial.print(logEvent.fullname);
Serial.print(" ");
}
}
Вот пример вывода:
Input 1 - Lebron James
Output 1- Lebron James
Input 2 - Kobe Bryant
Output 2 - Kobe Bryant Kobe Bryant (The output should be - Lebron James Kobe Bryant)
Input 3 - LeGoat
Output 3 - LeGoat LeGoat LeGoat (The output should be - Lebron James Kobe Bryant LeGoat)
Как это исправить?
ПРАВКА. Вот мой код:
#include "Arduino.h"
#include <EDB.h>
// Используйте внешнюю SD-карту SPI в качестве хранилища
#include <SPI.h>
#include <SD.h>
int recnumber = 1;
//Arbitrary definition
struct LogEvent {
int id;
int temperature;
char fullname[30];
}
logEvent;
inline void writer (unsigned long address, const byte* data, unsigned int recsize) {
digitalWrite(13, HIGH);
dbFile.seek(address);
dbFile.write(data,recsize);
dbFile.flush();
digitalWrite(13, LOW);
}
inline void reader (unsigned long address, byte* data, unsigned int recsize) {
digitalWrite(13, HIGH);
dbFile.seek(address);
dbFile.read(data,recsize);
digitalWrite(13, LOW);
}
EDB db(&writer, &reader);
// Run the demo
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
Serial.begin(9600);
Serial.println(" Extended Database Library + External SD CARD storage demo");
Serial.println();
randomSeed(analogRead(0));
if (!SD.begin(SD_PIN)) {
Serial.println("No SD-card.");
return;
}
// Check dir for db files
if (!SD.exists("/db")) {
Serial.println("Dir for Db files does not exist, creating...");
SD.mkdir("/db");
}
if (SD.exists(db_name)) {
dbFile = SD.open(db_name, FILE_WRITE);
// Sometimes it wont open at first attempt, espessialy after cold start
// Let's try one more time
if (!dbFile) {
dbFile = SD.open(db_name, FILE_WRITE);
}
if (dbFile) {
Serial.print("Openning current table... ");
EDB_Status result = db.open(0);
if (result == EDB_OK) {
Serial.println("DONE");
} else {
Serial.println("ERROR");
Serial.println("Did not find database in the file " + String(db_name));
Serial.print("Creating new table... ");
db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
Serial.println("DONE");
return;
}
} else {
Serial.println("Could not open file " + String(db_name));
return;
}
} else {
Serial.print("Creating table... ");
// create table at with starting address 0
dbFile = SD.open(db_name, FILE_WRITE);
db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
Serial.println("DONE");
}
deleteAll();
recordLimit();
countRecords();
}
char testName[30];
void loop()
{
if(Serial.available())
{
Serial.println("Waiting for name...");
index = 0;
for(int i = 0; i < sizeof(testName); ++i)
{
testName[i] = (char)0;
}
while(Serial.available())
{
char character = Serial.read();
testName[index] = character;
index++;
}
createRecords(testName);
selectAll();
delay(1000);
}
delay(1000);
}
void createRecords(char *testName)
{
Serial.print("Creating Record... ");
logEvent.id = recnumber;
logEvent.temperature = random(1, 125);
strcpy(logEvent.fullname, testName);
recnumber++;
EDB_Status result = db.appendRec(EDB_REC logEvent);
}
void selectAll()
{
for (int recno = 1; recno <= db.count(); recno++)
{
EDB_Status result = db.readRec(recno, EDB_REC logEvent);
if (result == EDB_OK)
{
Serial.print("Recno: ");
Serial.print(recno);
Serial.print(" ID: ");
Serial.print(logEvent.id);
Serial.print(" Temp: ");
Serial.print(logEvent.temperature);
Serial.print(" Fullname: ");
Serial.print(logEvent.fullname);
Serial.print(" Length: ");
Serial.println(strlen(logEvent.fullname));
}
}
}
Вот результат:
Extended Database Library + External SD CARD storage demo
Openning current table... DONE
Truncating table... DONE
Record Limit: 2045
Record Count: 0
Record Count: 0
Waiting for name...
Name received: Kobe Bryant
LogEvent Fullname:
The sentence entered is 11 characters long
Creating Record... Done Creating Record...
Recno: 1 ID: 1 Temp: 64 Fullname: Kobe Bryant Length: 11
Waiting for name...
Name received: Lebron James
LogEvent Fullname: Kobe Bryant
The sentence entered is 12 characters long
Recno: 1 ID: 1 Temp: 64 Fullname: Kobe Bryant Length: 11
Creating Record... Done Creating Record...
Recno: 1 ID: 1 Temp: 64 Fullname: Lebron James Length: 12
Recno: 2 ID: 2 Temp: 78 Fullname: Lebron James Length: 12
Waiting for name...
Name received: Michael Jordan
LogEvent Fullname: Lebron James
The sentence entered is 14 characters long
Recno: 1 ID: 1 Temp: 64 Fullname: Lebron James Length: 12
Recno: 2 ID: 2 Temp: 78 Fullname: Lebron James Length: 12
Creating Record... Done Creating Record...
Recno: 1 ID: 1 Temp: 64 Fullname: Michael Jordan Length: 14
Recno: 2 ID: 2 Temp: 78 Fullname: Michael Jordan Length: 14
Recno: 3 ID: 3 Temp: 29 Fullname: Michael Jordan Length: 14
Обновление: Я пытался использовать memset
, но результат все равно такой же, как и выше.
@Xirb, 👍1
Обсуждение2 ответа
Лучший ответ:
Мне удалось решить эту проблему. Проблема в библиотеке SD - карт Arduino. Я скачал эту библиотеку библиотекиSdFat, включил ее в скетч #включить "SdFat.h"
и определил SdFat SD
. Я также удалил #include <SD.h><SD.h>
.
Я только что попытался расширить один из примеров (с помощью внутреннего EEPROM), и он работает, как и ожидалось:
/*
EDB_Simple.pde
Расширенная Библиотека Баз Данных + Внутренний Демонстрационный Скетч Arduino EEPROM
Страница проекта Расширенной библиотеки баз данных находится здесь:
http://www.arduino.cc/playground/Code/ExtendedDatabaseLibrary
*/
#include "Arduino.h"
#include <EDB.h>
// Используйте внутренний EEPROM Arduino в качестве хранилища
#include <EEPROM.h>
// Раскомментируйте строку, соответствующую вашей платформе
#define TABLE_SIZE 512 // Arduino 168 or greater
// Количество демо-записей, которые должны быть созданы. Этого должно быть меньше
// чем (TABLE_SIZE - sizeof(EDB_Header)) / sizeof(LogEvent). Если он выше,
// operations вернет значение EDB_OUT_OF_RANGE для всех записей, находящихся за пределами допустимого диапазона.
#define RECORDS_TO_CREATE 10
// Определение произвольной записи для этой таблицы.
// Это следует изменить, чтобы отразить ваши потребности в записи.
struct LogEvent {
int id;
int temperature;
char test[20] = {};
}
logEvent;
// Обработчики чтения и записи для использования библиотеки EEPROM
void writer(unsigned long address, byte data)
{
EEPROM.write(address, data);
}
byte reader(unsigned long address)
{
return EEPROM.read(address);
}
// Создать объект EDB с соответствующими обработчиками записи и чтения
EDB db(&writer, &reader);
void setup()
{
Serial.begin(115200);
Serial.println("Расширенная библиотека баз данных + Внутренняя демонстрационная версия EEPROM для Arduino");
Serial.println();
db.create(0, TABLE_SIZE, sizeof(logEvent));
Serial.print("Record Count: "); Serial.println(db.count());
Serial.println("Creating Records...");
int recno;
for (recno = 1; recno <= RECORDS_TO_CREATE; recno++)
{
logEvent.id = recno;
logEvent.temperature = recno * 2;
strcpy(logEvent.test, (String{recno*3} + " whatever " + recno).c_str());
db.appendRec(EDB_REC logEvent);
}
Serial.print("Record Count: "); Serial.println(db.count());
// Благодаря [email protected] для следующей строки
for (recno = 1; recno <= RECORDS_TO_CREATE; recno++)
{
db.readRec(recno, EDB_REC logEvent);
Serial.print("ID: "); Serial.print(logEvent.id);
Serial.print(" Temp: "); Serial.print(logEvent.temperature);
Serial.print(" Data: "); Serial.println(logEvent.test);
}
}
void loop()
{
}
Выходные данные:
Extended Database Library + Arduino Internal EEPROM Demo
Record Count: 0
Creating Records...
Record Count: 10
ID: 1 Temp: 2 Data: 3 whatever 1
ID: 2 Temp: 4 Data: 6 whatever 2
ID: 3 Temp: 6 Data: 9 whatever 3
ID: 4 Temp: 8 Data: 12 whatever 4
ID: 5 Temp: 10 Data: 15 whatever 5
ID: 6 Temp: 12 Data: 18 whatever 6
ID: 7 Temp: 14 Data: 21 whatever 7
ID: 8 Temp: 16 Data: 24 whatever 8
ID: 9 Temp: 18 Data: 27 whatever 9
ID: 10 Temp: 20 Data: 30 whatever 10
Я постараюсь разобраться в этом., @Xirb
Я попробовал это, и это работает, как вы сказали. Может быть, моя проблема в библиотеке SD-карт " SD.h`, @Xirb
@Xirb или читатель/писатель не работает как ожидающий. Я использовал разные подписи - они вызываются для каждого байта, @KIIV
- Онлайн-проблема подключения Arduino к базе данных MySQL
- nRF24L01 + потеря пакетов, вызванная считыванием Arduino и связью с датчиками
- Подключение датчика давления к Arduino для сбора данных о давлении и времени
- Регистрация данных при просмотре меню на ЖК-экране
- Конфликт между шилдом SD-карты и акселерометром
- Синхронизация нескольких MPU9250
- Быстрая регистрация данных
- ЭБР. Можно ли создать несколько таблиц с помощью db.create()?
@LookAlterno Конечно, @Xirb
Ладно, я постараюсь над этим поработать., @Xirb
Хорошо. Работаю над этим., @Xirb
Можете ли вы загрузить соглашение, которое вы сделали здесь, у меня та же проблема, @Serkan Tapan