Как правильно обрабатывать строку Arduino
Я читал, что строка Arduino плоха, так как она вызывает фрагментацию памяти, поэтому я стараюсь избегать их в основном. Но у меня все еще есть некоторые случаи, когда я не совсем уверен, что они в порядке.
Первый-в печатных заявлениях:
У меня есть функция, которая выводит сообщение об успехе или ошибке на последовательный порт, например: Serial.println("Success");. Это нормально или я должен (например) предварительно определить строку с помощью #define SUCCESS" SUCCESS"?
Что приводит меня к следующему случаю, определяющему:
Я использую MQTT и имею темы, определенные как выше, например #define TOPIC_COLOR "light/color". Это нормально?
Третий - с Ардуинойсоном:
Я использую строки в качестве клавиш, как so lights["red"] = redVal;. Этот вызов выполняется в нескольких местах, поэтому я предполагаю, что строка будет создана несколько раз? Обходной путь/улучшение, о котором я думал, - это использование перечисления, определяющего свойства и использующего его в качестве ключа.
Спасибо за все комментарии, советы и объяснения!
@matthesinator, 👍1
Обсуждение1 ответ
Лучший ответ:
+1 к комментариям @majenko. Я стараюсь избегать класса String, поскольку мне нравится знать, что на самом деле происходит , и я придерживаюсь char * и char [] в целом (и функций stdlib , таких как sprintf, strlenи т.д.).
Пара заметок по вашему вопросу:
"фу/бар"- это хорошо. Некоторые символы имеют специальные значения в самом языке C, поэтому вам нужно избежать их спомощью \. Например, еслибы "был частью вашей литеральной строки, вы бы написали"foo\"bar\""Я склонен использовать
ArduinoJsonдля разбора. Если мое приложение просто отправляет полезные данные JSON, я просто строю его спомощью sprintfилиprint, что приводит к более мелким программам. Но, думаю, это вопрос выбора. Это большая библиотека.
Спасибо! Я использую ArduinoJson для анализа и отправки, но также и для хранения текущего состояния, очень удобно, что он делает все эти вещи. На данный момент места для хранения достаточно, если его станет мало, мне придется придумать что-нибудь другое..., @matthesinator
- Выделение строковой памяти Arduino
- Как исправить код утечки памяти в ESP8266/NodeMCU, вызванный концентрацией строк?
- Как работают строковые указатели в Arduino?
- Чтение из SPIFFS - Как лучше всего работать со строковым (или char) массивом с неопределенной длиной?
- Почему EEPROM.get() не работает?
- Удаление нежелательных символов из типа char
- Второй элемент в массиве не назначается из объекта структуры, ArduinoJson
- ArduinoJSON: использование ссылки на ссылку при анализе массива массивов
Вы путаете "строки" с классом Arduino
String., @Majenko@Majenko Итак, мое использование этих строк нормально?, @matthesinator
Строки, как и в "этом", являются просто кусками статических данных. Именно тогда, когда вы начинаете возиться со "строковыми" объектами, возникают проблемы. Хотя я не знаю, что ArduinoJson делает со строковыми индексами. На меньших MCU (AVR) вы *должны* использовать
F("stringliteral"), чтобы уменьшить использование оперативной памяти, когда это возможно., @Majenko@Majenko хорошо, спасибо. Я тоже не знаю, но он, кажется, широко используется, поэтому я предполагаю, что он справляется с ними достаточно хорошо. Спасибо за совет! Я сейчас нахожусь на ESP8266, так что пока это не будет проблемой, @matthesinator
пара моментов: иногда можно использовать строки; в setup(), статических глобалах, const и т. Д. Более того, модификация струн-это настоящий бесшумный убийца. ESP также имеет гораздо больше оперативной памяти, и я видел, как они "перестают тонуть" в коде, который неизбежно потопит AVR. Я не говорю, что струна не лишена подводных камней, просто не каждое ее использование является демонстрацией., @dandavis