Запись/Чтение строк на/с внешнего EEPROM. Откуда берутся эти лишние символы.
- Войдите на сайт для отправки комментариев
Ср, 09/12/2020 - 23:31
Всем здравствуйте. Вот пытаюсь записать массив строк во внешнюю память. Сначала перевожу в массив символов, потом записываю. Но при чтении возникла некоторая проблема- появились лишние символы, а в конце и вовсе лишние повторение массива. Код и вывод на консоль прилагается:
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
В которой строке чтение происходит?
и вставьте код по правилам форума и укажите модель памяти EEPROM(ссылку где покупали товар или название модели если знаете)
Почему скетч без начала и без конца? Где номера строк? Вставляйте нормально.
Чтение на второй строке функция- readAddress(address)
В Wiring нет функции readAddress(address).
Прошу прощения за не полностью выложенный скетч. В качестве памяти использую 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; }char charArrayBack[a]; /////////////////////////////////////////////////////////////////////////// for (int i = 0; i < a; i++) { charArrayBack[i] = readAddress(address); if (charArrayBack[i] == ' ') { int k = strlen(charArrayBack);А прочитай, например, как strlen работает.
Я использовал, приведенный ниже способ чтения с еепром:
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; }Например:
... char charArrayBack[a]; memset(charArrayBack, '\0', sizeof(charArrayBack)); // <<<<<<<< for (int i = 0; i < a; i++) { charArrayBack[i] = readAddress(address); ...Объяснение: ASCIIZ
Оптимизацию фрагмента кода, приведенного выше, можете самостоятельно произвести.
Спасибо. Сейчас попробую с этим разобраться.