Запись/Чтение строк на/с внешнего EEPROM. Откуда берутся эти лишние символы.

Kess
Offline
Зарегистрирован: 09.12.2020

Всем здравствуйте. Вот пытаюсь записать массив строк во внешнюю память. Сначала перевожу в массив символов, потом записываю. Но при чтении возникла некоторая проблема- появились лишние символы, а в конце и вовсе лишние повторение массива. Код и вывод на консоль прилагается:

for (int i = 0; i < a; i++) {
charArrayBack[i] = readAddress(address);
  if (charArrayBack[i] == ' ') {
    int k = strlen(charArrayBack);
    Serial.println(k);
    Serial.print("Read from memory: ");
    for (int j = 0; j < k; j++) { // посмотреть что там прочитал
       Serial.print(charArrayBack[j]);
    }
    /*Serial.println("");
    String string2(charArrayBack);
    Serial.println(string2);*/
  }
Serial.println(charArrayBack[i]);
address += 1;
}
 
с консоли:
 
Able Bond Cooper Denny Eagle 
Able Bond Cooper Denny Eagle 
Returned value: 
30
A
b
l
e
8
Read from memory: Able ⸮!% 
B
o
n
d
15
Read from memory: Able Bond ,30 
C
o
o
p
e
r
18
Read from memory: Able Bond Cooper ⸮ 
D
e
n
n
y
24
Read from memory: Able Bond Cooper Denny ⸮ 
E
a
g
l
e
59
Read from memory: Able Bond Cooper Denny Eagle ⸮Able Bond Cooper Denny Eagle 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

В которой строке чтение происходит?

mixail844
Offline
Зарегистрирован: 30.04.2012

 и вставьте код по правилам форума и укажите модель памяти EEPROM(ссылку где покупали товар или название модели если знаете)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Почему скетч без начала и без конца? Где номера строк? Вставляйте нормально.

Kess
Offline
Зарегистрирован: 09.12.2020

Чтение на второй строке функция- readAddress(address)

sadman41
Offline
Зарегистрирован: 19.10.2016

В Wiring нет функции readAddress(address).

Kess
Offline
Зарегистрирован: 09.12.2020

Прошу прощения за не полностью выложенный скетч. В качестве памяти использую 24c64.

#include <Wire.h>
#define EEPROM_I2C_ADDRESS 0x50
#define len(x) sizeof(x)/sizeof(x[0])

String arrey[] = {"Able", "Bond", "Cooper", "Denny", "Eagle"};
String arrayString[] = {};
String string = "";
int index = 0;

void setup() {
  
Wire.begin();
Serial.begin(9600);
////////////////////////////////////////////////////////////////////////////
for (int i = 0; i < len(arrey); i++) { 
  string += arrey[i];
  string += ' ';
}
//==========================================================================
Serial.println(string);
int a = string.length() + 1;
char charArray[a];
string.toCharArray(charArray, a);
Serial.println(charArray);
//int l = strlen(charArray);
int address = 0;
///////////////////////////////////////////////////////////////////////////
for (int i = 0; i < a; i++) {
writeAddress(address, charArray[i]);
address += 1;
}
//==========================================================================
address = 0;
Serial.println("Returned value: ");
Serial.println(a);
char charArrayBack[a];
///////////////////////////////////////////////////////////////////////////
for (int i = 0; i < a; i++) {
charArrayBack[i] = readAddress(address);
  if (charArrayBack[i] == ' ') {
    int k = strlen(charArrayBack);
    Serial.println(k);
    Serial.print("Read from memory: ");
    for (int j = 0; j < k; j++) { // посмотреть что там прочитал
       Serial.print(charArrayBack[j]);
    }
    /*Serial.println("");
    String string2(charArrayBack);
    Serial.println(string2);*/
  }
Serial.println(charArrayBack[i]);
address += 1;
}
//===========================================================================
}
void loop()
{
}

void writeAddress(int address, char val)

{
Wire.beginTransmission(EEPROM_I2C_ADDRESS);
Wire.write((int)(address >> 8)); // MSB
Wire.write((int)(address & 0xFF)); // LSB
Wire.write(val);
Wire.endTransmission();
delay(5);
}

byte readAddress(int address) {
char rData = "";
Wire.beginTransmission(EEPROM_I2C_ADDRESS);
Wire.write((int)(address >> 8)); // MSB
Wire.write((int)(address & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(EEPROM_I2C_ADDRESS, 1);
rData = Wire.read();
return rData;
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

Kess пишет:

char charArrayBack[a];
///////////////////////////////////////////////////////////////////////////
for (int i = 0; i < a; i++) {
charArrayBack[i] = readAddress(address);
  if (charArrayBack[i] == ' ') {
    int k = strlen(charArrayBack);

А прочитай, например, как strlen работает.

Kess
Offline
Зарегистрирован: 09.12.2020

Я использовал, приведенный ниже способ чтения с еепром:

byte readAddress(int address) {
char rData = "";
Wire.beginTransmission(EEPROM_I2C_ADDRESS);
Wire.write((int)(address >> 8)); // MSB
Wire.write((int)(address & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(EEPROM_I2C_ADDRESS, 1);
rData = Wire.read();
return rData;
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Например:

...
char charArrayBack[a];
memset(charArrayBack, '\0', sizeof(charArrayBack));  // <<<<<<<<
for (int i = 0; i < a; i++) {
charArrayBack[i] = readAddress(address);
...

Объяснение: ASCIIZ

Оптимизацию фрагмента кода, приведенного выше, можете самостоятельно произвести.

Kess
Offline
Зарегистрирован: 09.12.2020
Able Bond Cooper Denny Eagle 
Able Bond Cooper Denny Eagle 
Returned value: 
30 //      переменная "a"
A
b
l
e
8  //       переменная "k"
Read from memory: Able ⸮!% 
B
o
n
d
15 //  переменная "k"
Read from memory: Able Bond ,30 
C
o
o
p
e
r
18  //   переменная "k"
Read from memory: Able Bond Cooper ⸮ 
D
e
n
n
y
24  //   переменная "k"
Read from memory: Able Bond Cooper Denny ⸮ 
E
a
g
l
e
59  //  переменная "k"
Read from memory: Able Bond Cooper Denny Eagle ⸮Able Bond Cooper Denny Eagle 
Kess
Offline
Зарегистрирован: 09.12.2020

Спасибо. Сейчас попробую с этим разобраться.