Вспомогательный объект Flash String в качестве переменной
Таким образом, у меня есть куча часто используемых массивов символов для построения команд в моей библиотеке. Поэтому, чтобы сохранить память, я помещаю их во flash,через PROGMEM ext,
typedef const char PROGMEM ProgChar;
ProgChar AT[] = "AT";
ProgChar AT_RST[] = "RST";
Тогда в моей программе у меня все это выходит в порт через:
*hws << AT << PLUS << CWMODE << EQUAL; //hws can be any Print type,
Это обрабатывается перегрузкой оператора<<;
static Print &operator <<(Print &obj, ProgChar* arg) {
char pbuffbuffer[12]; //create a buffer,
obj.print(loadProgmemVal(arg,pbuffbuffer)); //Загрузить его, а затем перейти к методу печати obj.
return obj;
}
Но это также перегружает оператор << для всех const char*, что заставляет меня сделать обходной путь:
hws->print(1); //HACK
Сначала я думал, что перегружу оператор для обработки как объекта char*, так и объекта Prog Char, но, к сожалению, они оба обрабатываются как одно и то же во время выполнения, что делает эту идею бесполезной.
Поэтому после вынюхивания я нахожу тип __FlashStringHelper и макрос. Что позволило бы мне иметь тип sepperate для этих переменных и позволить мне перегрузиться.
Но проблема в том, что я не могу найти хороший способ создать их:
const __FlashStringHelper MYVAR = F("Some text to be progchared");
Не компилирует =/
Теперь я, вероятно, мог бы сделать какой-то вспомогательный метод, чтобы загрузить их все, но это просто исправление хака с помощью другого хака... Есть ли какой-нибудь чистый способ сделать это? Поэтому я могу использовать << для всех типов,
*hws << AT << PLUS << CWMODE << EQUAL << 1 << "\r\n"; //1 and Return break...
@Steven Venham, 👍4
Обсуждение1 ответ
Это законно?
typedef const char ProgChar;
ProgChar AT[] = "AT";
Я бы подумал, что PROGMEM не может быть в typedef, т. Е.:
typedef const char ProgChar;
ProgChar AT[] PROGMEM = "AT";
Если вы имели в виду "Is typedef const char PROGMEM ProgChar; ProgChar AT[] = "AT";
", то, по-видимому, это так. typedef const char PROGMEM ProgChar; ProgChar В[] = "В"; пустая настройка() { Serial.begin(115200); Serial.println((const __FlashStringHelper *)&В[0]); } пустая петля() { ; }
компилируется, запускается и выдает ожидаемый результат., @JRobert
- Пытаюсь прошить ESP8266 с помощью Arduino UNO
- Невозможно выполнить операцию записи во время работы флэш-памяти esp8266.
- AT-команда не отвечает на последовательный монитор
- Отправка данных Arduino в MySQL с помощью phpMyAdmin и XAMPP на Windows10
- Arduino выводит значения мусора на serial monitor с ESP8266
- ошибка: espcomm_upload_mem failed при загрузке скетча
- фатальная ошибка ESP8266WiFi.h: Такого файла или каталога нет
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
Идея: Объекты во Flash имеют меньшее значение PTR, чем объекты в оперативной памяти, и если да, то что тогда отсекается? НАПРИМЕР: 0-04f00 = Flash 04f01-fffff = Ram, ext., @Steven Venham
Кажется, рекомендуемый стиль-использовать макрос
FPSTR()
. https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.htmlstatic const char xyz[] PROGMEM = "Это строка, хранящаяся во flash"; Serial.println(FPSTR(xyz));
, @Mikael Patel