Сохранение строки с помощью макроса F()

Я новичок в Arduino и пока не совсем понимаю макрос F().

В моем коде есть Строка, и поскольку я хочу передать ее через WebServer, мне нужно записать ее в ответ.

Мне нужно каким-то образом преобразовать String, чтобы поместить ее в функцию fastrprintln().

String weather_json = getWeatherData();
char weather[2048];
weather_json.toCharArray(weather,2048);
client.fastrprintln(F(weather));

У тебя есть для меня какие-нибудь идеи?

, 👍7

Обсуждение

Что вы имеете в виду, когда говорите «Мне нужно написать это в ответе»? Это опечатка?, @Greenonline

Макрос F() предназначен для литералов (например, F("foo")), а не для переменных., @Nick Gammon

«_Мне нужно преобразовать строку, чтобы поместить ее в функцию fastrprintln()._» Нет, не нужно: client.println(getWeatherData());, @Edgar Bonet


1 ответ


11

Макрос ядра Arduino F() принимает строковый литерал и заставляет компилятор поместить его в память программы. Это сокращает объём необходимой SRAM, поскольку строка не копируется в буфер памяти данных. Для доступа к данным, хранящимся в памяти программы, требуются специальные функции. Ядро Arduino скрывает множество типичных случаев использования, таких как:

Serial.println(F("Hello world"));

Дополнительную информацию о низкоуровневом доступе к памяти программы можно найти в документации по AVR GCC libc. Макрос F() определен следующим образом:

class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper*>(PSTR(string_literal)))

Класс FlashStringHelper помогает компилятору распознавать этот тип строкового литерала при передаче его функциям Arduino. Ниже приведены несколько примеров:

// Конструктор строк со строковым литералом памяти программы
String::String(const __FlashStringHelper *str);

// Печать (последовательная и т. д.) строкового литерала памяти программы
size_t Print::print(const __FlashStringHelper *);
size_t Print::println(const __FlashStringHelper *);

Не следует использовать макрос F() ядра Arduino с чем-либо, кроме строкового литерала.

,

У меня возникла проблема с блокировкой программы, поэтому, прочитав ваш ответ, я добавил макрос F() к строковым литералам, и этого оказалось достаточно, чтобы решить проблему. Должно быть, у меня меньше памяти, чем я предполагал... В любом случае, спасибо, что познакомили меня с этим макросом, спасающим от блокировок., @Jacksonkr