Вспомогательный объект 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...

, 👍4

Обсуждение

Идея: Объекты во Flash имеют меньшее значение PTR, чем объекты в оперативной памяти, и если да, то что тогда отсекается? НАПРИМЕР: 0-04f00 = Flash 04f01-fffff = Ram, ext., @Steven Venham

Кажется, рекомендуемый стиль-использовать макрос FPSTR(). https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html static const char xyz[] PROGMEM = "Это строка, хранящаяся во flash"; Serial.println(FPSTR(xyz));, @Mikael Patel


1 ответ


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