Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

запись строки в EEPROM

Тема в разделе "ESP8266 Arduino IDE", создана пользователем mishgan, 15 авг 2016.

  1. mishgan

    mishgan Читатель

    Сообщения:
    92
    Симпатии:
    5
    Нужно сохранить строки в EEPROM
    Написал 2 функции

    Код (Text):
    1. void write_string_EEPROM (int Addr,char *Str) {
    2. int length=String(Str).length()+1;
    3. EEPROM.write(Addr,length);
    4. delay(50);
    5.  
    6. for (int j=1; j <=length ; j++) {
    7. byte hi = highByte(Str[j-1]);
    8. byte low = lowByte(Str[j-1]);
    9. EEPROM.write(Addr+j,hi);
    10. delay (50);
    11. EEPROM.write(Addr+j+64,low);
    12. delay (50);
    13. }
    14. EEPROM.commit();
    15. }
    16.  
    17. char *read_string_EEPROM (int Addr) {
    18. int length= EEPROM.read(Addr);
    19. char buf[length+1];
    20. for (int j=1; j <=length ; j++) {
    21. buf[j-1] = word(EEPROM.read(Addr+j),EEPROM.read(Addr+j+64));;
    22. }
    23. buff[length+1] = '\0';
    24. return buf;
    25. }
    write_string_EEPROM (20,"string");
    Serial1.println (read_string_EEPROM (20));
    Но почему то они не работают. В сериал порт вываливается какой то мусор. Что я делаю не так?
     
  2. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    Наверное, документацию невнимательно читаете.
    http://esp8266.ru/arduino-ide-esp8266/#eeprom
    Необходимо вызвать функцию EEPROM.begin(size) каждый раз перед началом чтения или записи, размер (указывается в байтах) соответствует размеру данных, которые вы намереваетесь использовать в EEPROM.
     
  3. mishgan

    mishgan Читатель

    Сообщения:
    92
    Симпатии:
    5
    вот спасибо подсказали. Сделал так.
    Код (Text):
    1. void write_string_EEPROM (int Addr, String Str) {
    2.     byte lng=Str.length();
    3.     EEPROM.begin (64);
    4.     if (lng>15 )  lng=0;
    5.     EEPROM.write(Addr , lng);
    6.     unsigned char* buf = new unsigned char[15];
    7.     Str.getBytes(buf, lng + 1);
    8.     Addr++;
    9.     for(byte i = 0; i < lng; i++) {EEPROM.write(Addr+i, buf[i]); delay(10);}
    10.     EEPROM.end();
    11. }
    12.  
    13. char *read_string_EEPROM (int Addr) {
    14.     EEPROM.begin(64);
    15.     byte lng = EEPROM.read(Addr);
    16.     char* buf = new char[15];
    17.     Addr++;
    18.     for(byte i = 0; i < lng; i++) buf[i] = char(EEPROM.read(i+Addr));
    19.     buf[lng] = '\x0';
    20.     return buf;
    21. }
     
    RusikOk и SERGEYSH нравится это.
  4. RusikOk

    RusikOk Новичок

    Сообщения:
    22
    Симпатии:
    0
    скажите пожалуйста для чего нужна эта строчка
    Код (Text):
    1. if (lng>15 )  lng=0;
     
  5. mishgan

    mishgan Читатель

    Сообщения:
    92
    Симпатии:
    5
    При длине строки больше 15 символов запись не происходит
     
  6. RusikOk

    RusikOk Новичок

    Сообщения:
    22
    Симпатии:
    0
    зачем это сделано?
     
  7. kab

    kab Авторитетный участник сообщества

    Сообщения:
    633
    Симпатии:
    78
    Зачем это сделано - понятно - чтобы не переполнить буфер:
    Код (Text):
    1.  
    2. buf = new unsigned char[15];
    3.  
    , непонятно другое, зачем тогда "EEPROM.begin (64);" а не "EEPROM.begin (16);" - например?
     
  8. kab

    kab Авторитетный участник сообщества

    Сообщения:
    633
    Симпатии:
    78
    И еще, вроде в read_string_EEPROM не хватает EEPROM.end();
     
    Andr нравится это.

Поделиться этой страницей