Преобразование строки C в строку C++
Моя программа работает на ESP32. Я получаю некоторые данные из Bluetooth, и строка Bluetooth представляет собой строку C. Мне нужно сохранить эти данные в строке RTC_DATA_ATTR, которая является строкой C++.
Простое выполнение c++string = cstring.c_str();
не сработает, так как оно просто сохранит указатель на место в памяти строки C, и цель чтобы сохранить данные в памяти RTC, чтобы ESP32 мог перейти в режим глубокого сна без потери данных.
Все остальные данные, кроме RTC, стираются в режиме глубокого сна, поэтому остается только указатель, указывающий ни на что.
Как мне скопировать данные из строки C в строку C++?
Любая помощь будет оценена по достоинству. Немного дополнительной информации: вот как это настроено на данный момент:
RTC_DATA_ATTR String ssid;
BLECharacteristic *cSsid = NULL;
ssid = cSsid->getValue().c_str();
@Marius Wanscher, 👍1
Обсуждение1 ответ
Лучший ответ:
просто, используя strcpy и используя char заданной длины, работает
RTC_DATA_ATTR char ssid["выделенная длина"];
strcpy(ssid, cSsid->getValue().c_str(), "выделенная длина");
- esp32 Stack canary watchpoint срабатывает
- Увеличить частоту дискретизации на плате ESP32
- Использование лямбд в качестве функций обратного вызова
- Считывание данных нескольких датчиков из текстового файла, расположенного на SD-карте в Arduino/ESP32
- Не могу скомпилировать .ino с помощью библиотеки ArduinoJson
- Тот же код работает на Arduino IDE, но не в PlatformIO IDE
- ESP32-WROOM-32 Wifisecureclient read() приводит к тарабарщине данных
- C++ против языка Arduino?
ты перепутал. вы хотите строку C из String?
.c_str()
изString
возвращает постоянный указатель на внутреннюю строку C (массив символов с нулевым завершением) String, которая находится в куче. но чтобы сохранить его в память RTC, что-то должно скопировать его в память RTC. нет необходимости копировать его в «С-строку» в памяти., @Jurajда, мой вопрос: как мне скопировать строку c в мою память rtc, @Marius Wanscher
Я согласен с @Juraj. Я полагаю, что вы неправильно использовали термины cstring и c++ strings. Насколько я понимаю ваш вопрос, у вас есть класс RTC_DATA_ATTR, который выделяет память для своего содержимого (строкового типа) из RTC EEPROM. Теперь вы спрашиваете, как вы можете инициализировать этот класс содержимым из «cstring». (поскольку вы используете
.c_str()
, я полагаю, что это также строка C++) Поскольку я не знаю, из какой библиотеки RTC_DATA_ATTR, я не могу сказать, как копировать текст в строку этого типа. Вы должны хотя бы добавить название библиотеки к вопросу или дать нам некоторую информацию о том, на что похож этот тип., @Peter Paul KieferВаш код приведет к исключению нулевого указателя, которое будет молча пропущено., @Peter Paul Kiefer
я понятия не имею, из какой библиотеки состоит RTC, я не #include никакую библиотеку, в которой он находится, @Marius Wanscher
он не дает никаких ошибок, когда я его компилирую, но в последовательном мониторе он println (rtcstring) просто печатает четкую строку, как если бы строка rtc была = null, @Marius Wanscher
я бы предположил, что команды RTC и Deep_sleep исходят от установленной платы в ArduinoIDE, @Marius Wanscher
но все, что я ищу, - это способ скопировать значение строки из bluetooth в строку RTC, что в моей голове должно быть решением: =, @Marius Wanscher
RTC_DATA_ATTR char ssid[33];
strcpy(ssid, cSsid->getValue().c_str());
, @JurajНулевой указатель — это ошибка времени выполнения, которую вы не можете увидеть во время компиляции. В контексте Arduino вы не распознаете исключение нулевого указателя. Но я уверен, что вы получили его, когда инициализировали
BLECharacteristic *cSsid = NULL;
, а затем использовали нулевое значение междуcSsid->getValue()
. Или я что-то пропустил, а NULL — это объект option? Может ли C++ обрабатывать объекты опций в то же время? Но в любом случае, не зная библиотеки, я не смогу вам помочь. Если вы просто хотите сделать свою строку постоянной, вы, вероятно, могли бы записать ее во флэш-память. https://randomnerdtutorials.com/esp32-flash-память/, @Peter Paul Kieferрешение найдено с помощью strcpy, спасибо, @Marius Wanscher
Извините, теперь я понимаю, что вы пытались. Да, это часть программного обеспечения ESP32. И вы, возможно, не захотите хранить дату в EEPROM, просто сделайте ее постоянной во время глубокого сна. (Думаю, мне пора идти спать ;-)) https://randomnerdtutorials.com/esp32-timer-wake-up-deep-sleep/ @Juraj дал вам решение. Но проблема с нулевым указателем все еще существует. Или это не весь код?, @Peter Paul Kiefer