Как правильно обрабатывать строку 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, вызванный концентрацией строк?
- Чтение из 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