Код (C++): String ReadStringEEPROM (int Adr) { char* buf = new char[28]; //указатель на буфер for (byte i = 0; i < 27; i++) //чтение еепром { buf[i] = char(EEPROM.read(i + Adr)); Serial.print(buf [i]);//вывод буфера побайтно 27 ед - выводится корректно } Serial.println(buf) ;//вывод буфера целиком 27 ед- здесь выводится мусор return String(buf).substring(0, 27);// в итоге возвращается мусор } Что можно сделать? Подскажите , пожалуйста собственно такая проблема. Arduino Mega. Иногда строка выводится корректно, иногда там мусор, иногда строка + мусор. Помогает перезагрузка, иногда только переподключение питания (внешнее +5 Вольт). Спойлер: такой мусор 1111122121199+9111-111-1122вывод буфера побайтно 27 ед 1111122121199+9111-111-1122⸮⸮m⸮gM⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮m⸮n⸮G⸮⸮W⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮ӛu⸮⸮z⸮⸮⸮⸮}⸮O۟⸮c|/⸮⸮⸮⸮⸮߾⸮⸮⸮⸮⸮_⸮=⸮⸮⸮O=⸮⸮⸮ߟ⸮nf⸮⸮⸮53?ͥ⸮⸮}⸮⸮⸮⸮⸮⸮Ϗ.w⸮⸮⸮\⸮ߤ⸮⸮r⸮⸮⸮⸮⸮c⸮:⸮5⸮⸮⸮ ⸮t⸮⸮⸮⸮4⸮Kpw⸮⸮+郎⸮⸮⸮?⸮N[⸮/⸮⸮c.O-⸮⸮⸮-1_⸮⸮sv⸮⸮ɝ0y⸮jgގ⸮7⸮⸮_⸮⸮{⸮_⸮⸮⸮⸮⸮⸮|9⸮+v⸮V⸮:}⸮1⸮[⸮뾜⸮ вывод буфера целиком 27 ед
Serial.print при выводе символьного массива должен каким-то образом узнать что массив закончился. общепринятый в си способ - так называемая "нуль-терминированная строка"
buf [27]=0; и new char[28] () я про это. Serial.println(buf) вводился лишь для отладки. был не понятно, почему не было возврата строки
я не понимаю, о чем вы спрашиваете возврат строки и терминальный ноль в массиве char[] не имеют никакого отношения друг к другу
А так: Код (C++): String ReadStringEEPROM (int Adr) { char* buf = new char[28]; //указатель на буфер for (byte i = 0; i < 27; i++) //чтение еепром { buf[i] = char(EEPROM.read(i + Adr)); Serial.print(buf [i]);//вывод буфера побайтно 27 ед - выводится корректно } buf[27] = '\0'; Serial.println(buf) ;//вывод буфера целиком 27 ед- здесь выводится мусор return String(buf).substring(0, 27);// в итоге возвращается мусор } работает? По моему ребята говорят про конец строки Тут проскочила мысль и про 0x0D и 0x0A... вот только не помню кто из них кто... но '\n' как я привык конец. Со string вообще не люблю сталкиваться (был случай когда он пробел 0x20 принимал за конец хоть и не строки, но слова имя параметра) И вообще тут то buf[xx], то *buf применяется... Вы уж определитесь в конце концов.
Не надо использовать: Код (C++): char* buf = new char[28]; смысла нет ни какого. И есть проблема в том, что выделенная память не освобождается. Достаточно: Код (C++): char buf[28]; Такой буфер будет удалён после выхода из функции.
0x0D это '\r', а 0x0A это '\n' но кстати да, динамический массив если он не удаляется может наделать делов.