Вы используете sizeof()
неправильно.
sizeof()
сообщает размер объекта во время компиляции.
Попробуйте этот эксперимент - запуститеэтот код:
#include <Arduino.h>
void setup() {
String x("");
String y("abc");
String z("abcdef");
Serial.begin(115200);
delay(1000);
Serial.println(sizeof(x));
Serial.println(sizeof(y));
Serial.println(sizeof(z));
}
void loop() {
}
На моем ESP8266 это выводит:
12
12
12
Это потому, что требуется 12 байтов, используя эту среду разработки для представления String
объекта (он может отличаться надругой процессор и компилятор).Класс String
динамически распределяет хранилище, поэтому sizeof
не может ничего сказать о длине самой строки, только размер объекта во время компиляции.
Для класса String
вам следуетиспользуйте метод length()
.Ваши строки:
char _data[sizeof(value)];
value.toCharArray(_data, sizeof(value));
for(int i = memoffset; i < memoffset + sizeof(value); i++)
должны быть записаны как
char _data[value.length()];
value.toCharArray(_data, value.length());
for(int i = memoffset; i < memoffset + value.length(); i++)
Для получения дополнительной информации см. Документацию для класса String .
You 'Скорее всего, все еще будут проблемы со строковыми ограничителями.C и C ++ заканчивают строки массива char
нулевым символом '\ 0', добавляя дополнительный байт к длине строк.Таким образом, ваш код должен быть более вероятным:
void changeConfig(String parameter, String value){
int memoffset = 0;
if(parameter == "ssid")
memoffset = 0;
else if(parameter == "pass")
memoffset = 33;
else
return;
#ifdef DEBUG
Serial.println("Updating Data");
Serial.print("Param: ");
Serial.println(parameter);
Serial.print("Value: ");
Serial.println(value);
#endif
EEPROM.begin(66);
char _data[value.length() + 1];
value.toCharArray(_data, value.length() + 1);
for(int i = memoffset; i < memoffset + value.length() + 1; i++)
{
#ifdef DEBUG
Serial.print("addr ");
Serial.print(i);
Serial.print(" data ");
Serial.println(_data[i]);
#endif
EEPROM.write(i,_data[i]);
}
EEPROM.end();
}
, чтобы позволить терминаторам строки работать правильно для 32-символьных идентификаторов SSID и паролей.Но фундаментальная проблема, которая нарушает ваш код, заключается в неправильном использовании sizeof
.