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

Вопрос Пропадают спецсимволы

Тема в разделе "Раздел для начинающих", создана пользователем Vypra, 12 фев 2019.

  1. Vypra

    Vypra Новичок

    Сообщения:
    78
    Симпатии:
    0
    У меня задача ввести на смартфоне емейл через поле ввода приложения RemoteXY, записать в EEPROM NodeMCU по нажатию кнопки в RemoteXY, считать с памяти EEPROM и вывести обратно через текстовую строку RemoteXY на смартфон. Все работает, но после вывода в текстовую строку убираются с емейла символы @ и точка. На каком этапе символы убираются и как с этим бороться?
    Часть кода записи/чтения:
    Код (Text):
    1.  
    2. void EEPROM_write()
    3. {
    4.   RemoteXY_Handler ();
    5.   if (RemoteXY.REC == 1)
    6.   {
    7.     String email_from_in(RemoteXY.email_from_in);
    8.     if (email_from_in != "")
    9.     {
    10.       EEPROM_ESP8266_WRITE (email_from_in, 14);
    11.     }
    12. }
    13.  
    14. // запись
    15. void EEPROM_ESP8266_WRITE(String buffer, int N)
    16. {
    17.   EEPROM.begin(512);
    18.   delay(10);
    19.   for (int L = 0; L < 32; ++L) {
    20.     EEPROM.write(N + L, buffer[L]);  // EEPROM.write(address, value)
    21.   }
    22.   EEPROM.commit();
    23. }
    24.  
    25.  
    26. void EEPROM_read()
    27. {
    28.   RemoteXY_Handler ();
    29.   String email_from_m = EEPROM_ESP8266_READ(14, 39);
    30.   email_from_m.toCharArray(RemoteXY.email_from_m, 26);
    31. }
    32.  
    33.  
    34. // чтение
    35. String EEPROM_ESP8266_READ(int min, int max)
    36. {
    37.   EEPROM.begin(512);
    38.   delay(10);
    39.   String buffer;
    40.   for (int L = min; L < max; ++L)
    41.     if (isAlphaNumeric(EEPROM.read(L)))
    42.       buffer += char(EEPROM.read(L));
    43.   return buffer;
    44. }
     
  2. Юрий Ботов

    Юрий Ботов Moderator Команда форума

    Сообщения:
    1.023
    Симпатии:
    172
    Код (Text):
    1. if (isAlphaNumeric(EEPROM.read(L))
    2.        buffer += char(EEPROM.read(L));
    Собственно вот тут и убираются. Бороться - закомментировать строку с if.
    Но насколько корректно будет при этом работать конструктор интерфейсов - не знаю.
     
    Последнее редактирование: 12 фев 2019
    Vypra нравится это.
  3. Vypra

    Vypra Новичок

    Сообщения:
    78
    Симпатии:
    0
    isAlphaNumeric не понимает спецсимволы как буквы? Интересно. Я думал что он приравнивает их к буквам. Значит я ошибался.
    Спасибо, попробую.
     
  4. Юрий Ботов

    Юрий Ботов Moderator Команда форума

    Сообщения:
    1.023
    Симпатии:
    172
    isAlphaNumeric - это только цифры и буквы алфавита, большие и маленькие. Ничего больше... ( [0-9A-Za-z] )
     
  5. nikolz

    nikolz Гуру

    Сообщения:
    3.626
    Симпатии:
    397
    если надо найти конец строки то поставьте if (EEPROM.read(L)!=0) buffer += char(EEPROM.read(L);
    если надо найти конкретный символ то сравнивайте с ним.
    если надо убрать служебные символы и пробелы то поставьте if (EEPROM.read(L)>32) buffer += char(EEPROM.read(L);
     
  6. Vypra

    Vypra Новичок

    Сообщения:
    78
    Симпатии:
    0
    Закомментировал, все прекрасно работает. Спасибо.
     
  7. Vypra

    Vypra Новичок

    Сообщения:
    78
    Симпатии:
    0
    Столкнулся с проблемой, когда записываем String меньше чем диапазон записи (мне так нужно), например диапазон записи 0-10, пишем строку в 0-5, 6-10 в пустых ячейках памяти записан 0, потом читаем, то после прочитанного текста появляются пустые символы. В винде 7 они выглядят как пробелы, а в винде 10 как квадратики.
    email_from_m.trim(); не убирает эти пробелы
    email_from_m.replace(" ",""); тоже не удаляет.
    Как определить что за символ появляется, чтоб потом убрать при помощи функции .replace () ?
     
  8. Сергей_Ф

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

    Сообщения:
    2.022
    Симпатии:
    221
    @Vypra String или []char ?
     
  9. Vypra

    Vypra Новичок

    Сообщения:
    78
    Симпатии:
    0
    Эта тема не касается топика, где Вы советовали пользоваться char. Я это помню.
    В данном случае работаем со String.
    Пишем с String, читаем в String по этому примеру:

    Код (Text):
    1. // запись
    2. void EEPROM_ESP8266_WRITE(String buffer, int N)
    3. {
    4. EEPROM.begin(512);
    5.   for (int L = 0; L < 32; ++L)
    6.     EEPROM.write (N + L, buffer[L]);
    7.   EEPROM.commit();
    8.   delay(10);
    9. }
    10.  
    11. // чтение
    12. String EEPROM_ESP8266_READ(int min, int max)
    13. {
    14.   String buffer;
    15.   EEPROM.begin(512);
    16.   for (int L = min; L < max; ++L)
    17.     buffer += char(EEPROM.read(L));
    18.   return buffer;
    19. }
    20.  
     
  10. Vypra

    Vypra Новичок

    Сообщения:
    78
    Симпатии:
    0
    Serial.print(EEPROM.read(L), BIN);
    Так можно идентифицировать символы, которые читаем с памяти? Или в другом формате прочесть.
     
  11. Сергей_Ф

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

    Сообщения:
    2.022
    Симпатии:
    221
    @Vypra если вы прочли String длинной max, то он и выведется такой длинны. Вы же не знаете сколько символов реально записано, а признака конца у String нет. Значение 0 в ячейки - это признак конца у массива символов. Если без String совсем никак, то переведите его в []char непосредственно перед записью в EEPROM, и наоборот после чтения.
     
    Последнее редактирование: 22 мар 2019
  12. Vypra

    Vypra Новичок

    Сообщения:
    78
    Симпатии:
    0
    Я знаю. Но эти пробелы в конце не те символы, которые я записал. Значит можно найти именно их в строке и удалить. Останется чистая строка, которая мне нужна. А для этого нужно понять что за символ добавляется.
     
  13. Сергей_Ф

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

    Сообщения:
    2.022
    Симпатии:
    221
    это именно вы записали своей горе-функцией. Это мусор, который находился в памяти по адресам сразу за тем, что вернула функция String. Что там, вы узнать можете перед записью. Но не после чтения.
    Перестаньте страдать фигнёй, извините за резкость. Работайте с нормальными данными.
     
  14. Vypra

    Vypra Новичок

    Сообщения:
    78
    Симпатии:
    0
    Сергей, при всем уважении к Вам, все же не соглашусь.
    Работа со String удобна при парсинге СМС и ответов SIM800. Стандартными функциями ардуино можно удобно и быстро выдергивать подстроки, заменять символы, удалять лишние пробелы, искать нужные части текста и т.д.
    Эта горе-функция работает. ))) При записи строки меньшей чем область записи, от конца строки до конца области записи прописываются пустые символы. И они же читаются обратно. Посмотрел через Serial.print(EEPROM.read(L), HEX); и перевел HEX в текст.
    Просто добавляем одну строчку if (EEPROM.read(L) != (char)00) и в String эти пустые символы не пишутся.

    Код (Text):
    1. String EEPROM_ESP8266_READ(int min, int max)
    2. {
    3.   EEPROM.begin(512);
    4.   String buffer;
    5.   for (int L = min; L < max + 1; ++L)
    6.   {
    7.     if (EEPROM.read(L) != (char)00)
    8.     {
    9.       buffer += char(EEPROM.read(L));
    10.     }
    11.   }
    12.   return buffer;
    13. }
    14.  
    У себя в коде я работаю с нормальными данными )))), но сейчас пишу парсинг СМС и уже написал парсинг ответа SIM800 при установке времени с NTP. Знаю что Вы не любите строки ))).
     
  15. Сергей_Ф

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

    Сообщения:
    2.022
    Симпатии:
    221
    @Vypra да при чем тут "люблю", "не люблю". Пользуйтесь сколько хотите. Только перед записью переведите в набор символов и пишите EEPROM. String - это класс С++ , набор функций, если хотите. Он для записи в EEPROM никак не подходит. Только и всего.
    Собственно, вы к этому сами и пришли уже. Только зачем то написали собственную функцию, вместо готовой из библиотеки ;)
     
    Последнее редактирование: 23 мар 2019
  16. Сергей_Ф

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

    Сообщения:
    2.022
    Симпатии:
    221

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