• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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;
}
 
Последнее редактирование:
Сверху Снизу