Как правильно обрабатывать строку Arduino

string memory json

Я читал, что строка Arduino плоха, так как она вызывает фрагментацию памяти, поэтому я стараюсь избегать их в основном. Но у меня все еще есть некоторые случаи, когда я не совсем уверен, что они в порядке.

Первый-в печатных заявлениях:
У меня есть функция, которая выводит сообщение об успехе или ошибке на последовательный порт, например: Serial.println("Success");. Это нормально или я должен (например) предварительно определить строку с помощью #define SUCCESS" SUCCESS"?

Что приводит меня к следующему случаю, определяющему:
Я использую MQTT и имею темы, определенные как выше, например #define TOPIC_COLOR "light/color". Это нормально?

Третий - с Ардуинойсоном:
Я использую строки в качестве клавиш, как so lights["red"] = redVal;. Этот вызов выполняется в нескольких местах, поэтому я предполагаю, что строка будет создана несколько раз? Обходной путь/улучшение, о котором я думал, - это использование перечисления, определяющего свойства и использующего его в качестве ключа.

Спасибо за все комментарии, советы и объяснения!

, 👍1

Обсуждение

Вы путаете "строки" с классом Arduino String., @Majenko

@Majenko Итак, мое использование этих строк нормально?, @matthesinator

Строки, как и в "этом", являются просто кусками статических данных. Именно тогда, когда вы начинаете возиться со "строковыми" объектами, возникают проблемы. Хотя я не знаю, что ArduinoJson делает со строковыми индексами. На меньших MCU (AVR) вы *должны* использовать F("stringliteral"), чтобы уменьшить использование оперативной памяти, когда это возможно., @Majenko

@Majenko хорошо, спасибо. Я тоже не знаю, но он, кажется, широко используется, поэтому я предполагаю, что он справляется с ними достаточно хорошо. Спасибо за совет! Я сейчас нахожусь на ESP8266, так что пока это не будет проблемой, @matthesinator

пара моментов: иногда можно использовать строки; в setup(), статических глобалах, const и т. Д. Более того, модификация струн-это настоящий бесшумный убийца. ESP также имеет гораздо больше оперативной памяти, и я видел, как они "перестают тонуть" в коде, который неизбежно потопит AVR. Я не говорю, что струна не лишена подводных камней, просто не каждое ее использование является демонстрацией., @dandavis


1 ответ


Лучший ответ:

2

+1 к комментариям @majenko. Я стараюсь избегать класса String, поскольку мне нравится знать, что на самом деле происходит , и я придерживаюсь char * и char [] в целом (и функций stdlib , таких как sprintf, strlenи т.д.).

Пара заметок по вашему вопросу:

  1. "фу/бар" - это хорошо. Некоторые символы имеют специальные значения в самом языке C, поэтому вам нужно избежать их с помощью \. Например, если бы " был частью вашей литеральной строки, вы бы написали "foo\"bar\""

  2. Я склонен использовать ArduinoJson для разбора. Если мое приложение просто отправляет полезные данные JSON, я просто строю его с помощью sprintf или print, что приводит к более мелким программам. Но, думаю, это вопрос выбора. Это большая библиотека.

,

Спасибо! Я использую ArduinoJson для анализа и отправки, но также и для хранения текущего состояния, очень удобно, что он делает все эти вещи. На данный момент места для хранения достаточно, если его станет мало, мне придется придумать что-нибудь другое..., @matthesinator