Сохранение строки с помощью макроса F()
Я новичок в Arduino и пока не совсем понимаю макрос F().
В моем коде есть Строка, и поскольку я хочу передать ее через WebServer, мне нужно записать ее в ответ.
Мне нужно каким-то образом преобразовать String, чтобы поместить ее в функцию fastrprintln().
String weather_json = getWeatherData();
char weather[2048];
weather_json.toCharArray(weather,2048);
client.fastrprintln(F(weather));
У тебя есть для меня какие-нибудь идеи?
@Nexor, 👍7
Обсуждение1 ответ
Макрос ядра 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
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Записать во флэш-память с помощью PROGMEM
- Глобальные переменные занимают много места в динамической памяти.
- Почему считается плохой практикой использовать ключевое слово "new" в Arduino?
- Выделение строковой памяти Arduino
- Как очистить кучу памяти в esp32
- Есть ли способ подключить оперативную память компьютера к Arduino?
- Когда использовать PROGMEM?
Что вы имеете в виду, когда говорите «Мне нужно написать это в ответе»? Это опечатка?, @Greenonline
Макрос F() предназначен для литералов (например, F("foo")), а не для переменных., @Nick Gammon
«_Мне нужно преобразовать строку, чтобы поместить ее в функцию fastrprintln()._» Нет, не нужно:
client.println(getWeatherData());, @Edgar Bonet