Проблема массива символов 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, но результат все равно такой же, как и выше.

, 👍1

Обсуждение

@LookAlterno Конечно, @Xirb

Ладно, я постараюсь над этим поработать., @Xirb

Хорошо. Работаю над этим., @Xirb

Можете ли вы загрузить соглашение, которое вы сделали здесь, у меня та же проблема, @Serkan Tapan


2 ответа


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

1

Мне удалось решить эту проблему. Проблема в библиотеке SD - карт Arduino. Я скачал эту библиотеку библиотекиSdFat, включил ее в скетч #включить "SdFat.h"и определил SdFat SD. Я также удалил #include <SD.h><SD.h>.

,

0

Я только что попытался расширить один из примеров (с помощью внутреннего 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