• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Неизвесные символы при чтении EEPROM

McKay

New member
Здравствуйте. Возникла проблема при чтении EEPROM. Я выделил под слово необходимое количество байт. Но если слово меньше, чем это количество, возникают проблемы при чтении.
otprav().png terminal.png
Под слово в переменной "mServer" было выделено 30 байт, выводит всего 21 сохранный символ, но видно, что считанное слово всеровно занимает 30 байт. В монитор порта все выводится нормально, но при отправке этой строки на веб страницу появляются невидимые, неправильные символы... Перед записью все затирал нулями.
web.pngresponse alert.png

Кто-нибудь сталкивался с этим? Знаете, как решить проблему?
 

Сергей_Ф

Moderator
Команда форума
Ну, поскольку, код вы свой не показали, то можно предположить, что у вас проблемы с преобразование массива символов С++ в строки.
 

McKay

New member
Запись:
for (int i = 0; i <=90 ; ++i) { EEPROM.write(i, 0); }
// Server
for (int i = 0; i < server.arg("mqtt_server").length(); i++) {
EEPROM.write(1+i, server.arg("mqtt_server"));
Serial.print("Wrote: ");
Serial.println(server.arg("mqtt_server"));
}
EEPROM.commit();
Serial.println("SUCCESS WRITING!");


Чтение:
// Server
String mServer;
for (int i = 1; i <= 30; i++) {
mServer += char(EEPROM.read(i));
}
 

McKay

New member
Вот этот мусор мне и нужно удалить... Я получай слово с веб страницы, а оно может быть произвольного размера, максимум 30 символов, я не знаю, сколько символов будет вводить пользователь.
 

enjoynering

Well-known member
самый простой и некрасивый способ - писать в начале размер строки, потом стоку.

Код:
EEPROM.write( server.arg("mqtt_server").length());

for (int i = 0; i < server.arg("mqtt_server").length(); i++) {
EEPROM.write(1+i, server.arg("mqtt_server"));
Serial.print("Wrote: ");
Serial.println(server.arg("mqtt_server"));
}
при чтении читать первый бит с количеством символов в строке и уж потом строку.

Код:
Чтение:
// Server
String mServer;
int size = EEPROM.read(1);

for (int i = 2; i <= size; i++) {
mServer += char(EEPROM.read(i));
}
повторюсь - это первое что пришло на ум, скорее всего существует более простой и элегантный способ.
 

Сергей_Ф

Moderator
Команда форума
Вот этот мусор мне и нужно удалить...
зачем вы копируете то что не надо? Вы же сами что все обнулили. Ну так проверьте каждый символ на 00 и если символы закончились, прекратите их комюпировать в mServer.
 

Сергей_Ф

Moderator
Команда форума
0 может быть и внутри слова, как тогда быть(
Какой символ на клавиатуре у вас соответствует коду 0х00? Как его введёт пользователь в названии?
Или вы думали что я предлагаю сравнить символ '0'? Нет, сравнивать надо байты.
 

McKay

New member
@Сергей_Ф, спасибо вам за совет. Накидал код, может плохой, но работает...
Чтение:
// Server
for (int i = 1; i <= 30; i++) {
if (char(EEPROM.read(i)) != 0x00) {
mServer += char(EEPROM.read(i));
}
}

response.png
 

Сергей_Ф

Moderator
Команда форума
Чуть лучше:
Код:
for (int i = 1; i <= 30; i++) {
char c = char(EEPROM.read(i)) ;
if (c == 0x00) break;
mServer += c;
}
 
Последнее редактирование:
Сверху Снизу