Запись телефонного номера в eeprom

Тема в разделе "Arduino & Shields", создана пользователем Pavel_1282, 21 дек 2020.

  1. Pavel_1282

    Pavel_1282 Нуб

    Запись телефонного номера в EEPROM
     
  2. Pavel_1282

    Pavel_1282 Нуб

    Всем привет, нужно записать телефонный номер в EEPROM и еще чтобы он выводился в мониторе порта. Может кто подскажет как организовать ?
    Код прилагаю.

    Код (C++):
    #include <EEPROM.h>
    int i;
    String y = "+79178473742";

    void setup() {
        Serial.begin(9600);
         }

    void loop() {
        Serial.println();
        Serial.print ("EEPROM= ");
        int x = y.toInt();
             delay(50);
        EEPROM.write(i, x);   // запись EEPROM
              Serial.println(x);
               delay(30000);
                        }
     
    Последнее редактирование: 21 дек 2020
  3. parovoZZ

    parovoZZ Гуру

    А зачем в EEPROM писать строку? Цифрами никак нельзя? И откуда функция узнает, сколько байт писать?
     
  4. Pavel_1282

    Pavel_1282 Нуб

    Можно и цифрами, не обязательно String. Мне главное чтобы правильно запоминался номер в формате +7########## поскольку дальше это будет нужно.
     
    Последнее редактирование: 21 дек 2020
  5. b707

    b707 Гуру

    ну, в данном случае проще как раз как строку, ибо оно уже хранится в String
    Нужно получить из String массив char, получить от нее же длину и посимвольно записать в ЕЕПРОМ
     
  6. Pavel_1282

    Pavel_1282 Нуб

    Т.е. переменную String преобразовать в массив char ?
     
  7. b707

    b707 Гуру

    да, я бы делал так. Но. это, конечно, не единственное решение
     
  8. Pavel_1282

    Pavel_1282 Нуб

    Вот вроде получилось

    Код (C++):
    #include <EEPROM.h>
    int i;
    String tel = "+79178473742";

    void setup() {
        Serial.begin(9600);
    }

    void loop() {
        Serial.println();
      Serial.print("EEPROM= ");
     
      unsigned char* buf = new unsigned char[15];
      tel.getBytes(buf, 15, 0);
      const char *tel2 = (const char*)buf;  
        delay(50);
           EEPROM.write(i, tel2);   // запись EEPROM
     
        Serial.println(tel2);
              delay(6000);
    }
    Работает... может кому пригодиться
     
  9. b707

    b707 Гуру

    Комментраии:
    - зачем нужна переменная tel2 ?
    - не понятно, почему из строки копируется именно 15 байт? - есть же длина строки, ее и надо использовать
    - при записи в ЕЕПРОМ откуда программа узнает, сколько байтов писать?
    - и при чтении обратно откуда программа узнает. сколько считывать?
     
    Последнее редактирование: 22 дек 2020
  10. SergeiL

    SergeiL Оракул Модератор

    Работать то может и будет, но переменные инициализировать "желательно", это я про "i".
    Хотя эта переменная и не нужна в этом примере.
    Может проще вместо "String tel" сделать const char tel[] = "+79178473742"; и тогда кучу всего можно выкинуть было бы?
     
  11. Pavel_1282

    Pavel_1282 Нуб

    Постараюсь ответить на твои вопросы.
    Tel 2 нужна чтобы уйти от String путем преобразования Tel в Char. Поскольку записывать в память EEPROM строки Srting нельзя компилятор ругается.
    Если про строку tel.getBytes(buf, 15, 0); то 15 байт - достаточно чтобы записать номер. Я пробовал ставил 7 номер печатался не полностью.
    И в этой записи tel.getBytes(buf, 15, 0) случайно - 15 не длинна строки? (Могу ошибаться).
    Это не вся программа а некий "макет" , который имитирует запись тел. номера в память, разработчик я поэтому 15 байт для записи тел номера видимо достаточно.

    Можешь тогда, если не затруднит написать, как использовать длину строки вместо байт_ов ?
     
    Последнее редактирование: 23 дек 2020
  12. Pavel_1282

    Pavel_1282 Нуб

    Почему String - там определитель номера "считывает входящий вызов", а там строка состоящая из символов, цифр и букв т.е. не только номер телефона. Поэтому я так подумал что лучше String использовать. Но если есть какие-то решения без String то с радостью рассмотрю
     
  13. akl

    akl Гуру

    а что, в обычный массив символы, цифры и буквы не влезут?
    хотя для всяких операций со строками String может быть удобнее.

    Код (C++):
    unsigned char* buf = new unsigned char[15];
    а где
    Код (C++):
    delete[] buf;
    ?
     
  14. Pavel_1282

    Pavel_1282 Нуб

    Для чего это вообще нужно ? Удалить buf ?
     
  15. b707

    b707 Гуру

    если вы в программе выделяете память оператором new - по окончании использования обязательно нужно освобождать память оператором delete. система сама это не делает.
    Возьмите себе это за непреложное правило, иначе обязательно рано или поздно нарветесь на утечки памяти.

    А вообще, в вашем коде не было никакого смысла пользоваться new. лучше было просто завести локальную переменную
    Код (C++):
    unsigned char buf [15];
    это и проще, и безопаснее для вас - раз вы пока плохо разбираетесь в динамических переменных
     
    Последнее редактирование: 24 дек 2020
  16. Pavel_1282

    Pavel_1282 Нуб

    С записью мы разобрались, всем спасибо!
    А как дополнить, чтобы можно было считать этот же номер телефона из памяти EEPROM в кот записали? И чтобы он был в таком же формате +7..........?
    Через
    Код (C++):
    EEPROM.read(i);
    ?
     
  17. b707

    b707 Гуру

    в цикле последовательно считываете каждый символ в соответвующий элемент символьного массива
     
  18. fogary

    fogary Гик

    Код (C++):
    #include <EEPROM.h>
    ...
      unsigned char* buf = new unsigned char[15];
      tel.getBytes(buf, 15, 0);
      const char *tel2 = (const char*)buf;
        delay(50);
           EEPROM.write(i, tel2);   // запись EEPROM
    ...
    }
    Нубский вопрос. Почему нельзя так?
    Код (C++):
    EEPROM.write(i, tel.c_str());
     
  19. Pavel_1282

    Pavel_1282 Нуб

    Можно, проверил, спасибо ! Еще один вариант он более простой
    Код (C++):
    #include <EEPROM.h>
    int i;
    String tel = "+79178473742";
    void setup() {
        Serial.begin(9600);
    }

    void loop() {

      Serial.println();
      Serial.print("EEPROM= ");
     
             delay(50);    
          EEPROM.write(i, tel.c_str());

          String tel2 = tel.c_str();
          Serial.println(tel2);
          delay(6000);
    }
     
  20. b707

    b707 Гуру

    слушайте, ну нафига опять промежуточная переменная tel2 ?
    Зачем вот это
    Код (C++):
    String tel2 = tel.c_str();
    Serial.println(tel2);
    Почему нельзя прямо из tel печатать?
    Код (C++):
    Serial.println(tel);