РЕШЕНО Странности eeprom

Тема в разделе "Arduino & Shields", создана пользователем WhiteFox, 26 июн 2021.

Метки:
  1. WhiteFox

    WhiteFox Нерд

    Вообщем потребовалось названия меню перенести в EEPROM(пользователь может менять названия), перепробовал куча способов и остановился на этом:
    Код (C++):
    void setup() {
      Serial.begin(9600);
      Serial.println("Test");
      String nameList[16];
      for (byte index = 0; index < 16; index++) {
        nameList[index] = getFormatString("Rele " + String(index + 1), 64);
        Serial.println(nameList[index]);
      }
        eeprom_write_block((void*)&nameList, 384, 96);
        String name;
      for (byte index = 0; index < 16; index++) {
        eeprom_read_block((void*)&name, (384 + (index * 6)), 6);
        Serial.println(name);
      }
    }

    String getFormatString(String text, byte newLengthText) {
      for (byte index = text.length(); index < newLengthText; index++) {
        text += " ";
      }
      return text;
    }
    Но и здесь не все чисто... EEPROM кушает string любой длины, при этом всегда выделяя 6 байт места.
    Возможно EEPROM записывает ссылки, а не значение, тогда как его заставить записывать string?
    Или такой алгоритм не прокатит и придется побайтово передавать string?
     
  2. WhiteFox

    WhiteFox Нерд

    Код (C++):
    void setup() {
      Serial.begin(9600);
      Serial.println("Test");

      for (byte index = 0; index < 16; index++) {
        String name = getFormatString(("Rele " + String(index + 1)), 12);
        for (byte indexChar = 0; indexChar < 12; indexChar++) {
          eeprom_write_byte((384 + indexChar + (12 * index)), (byte)name[indexChar]);
        }
      }
      for (byte index = 0; index < 16; index++) {
        String name = "";
        for (byte indexChar = 0; indexChar < 12; indexChar++) {
          name += (char)eeprom_read_byte((384 + indexChar + (12 * index)));
        }
        Serial.println(name);
      }
    }

    String getFormatString(String text, byte newLengthText) {
      for (byte index = text.length(); index < newLengthText; index++) {
        text += " ";
      }
      return text;
    }
    Этот работает 100%, но хотелось бы кидать блоками не тратя время на перезаписи...
     
    Последнее редактирование: 26 июн 2021
  3. b707

    b707 Гуру

    Размер переменной типа String всегда 6 байт. сама строка хранится отдельно. Стандартными функциями записать String в ЕЕПРОМ не получится.

    Я бы посоветовал вообще не использовать String. используйте просто текстовые строчки (массив символов chat*)
     
  4. WhiteFox

    WhiteFox Нерд

    Да, я уже понял, спасибо.