So I have a Bunch of commonly used char arrays to build commands in my library. So to preserve memory, I have them put into flash, via PROGMEM ext,
typedef const char PROGMEM ProgChar;
ProgChar AT[] = "AT";
ProgChar AT_RST[] = "RST";
Then in my program I have it all go out to A port via:
*hws << AT << PLUS << CWMODE << EQUAL; //hws can be any Print type,
This is handled by overloading the << operator;
static Print &operator <<(Print &obj, ProgChar* arg) {
char pbuffbuffer[12]; //create a buffer,
obj.print(loadProgmemVal(arg,pbuffbuffer)); //Load it, and then pass to obj print method.
return obj;
}
But this also overloads the << operator for all const char* Which makes me have to do a workaround:
hws->print(1); //HACK
At first, I thought I would overload the operator to handle both a char* and a Prog Char Object, But unfortunately, they are both treated as the same thing at run-time which makes that idea useless.
So after snooping I find the __FlashStringHelper type and macro. Which would allow me to have a sepperate type for these variables, and allow me to overload.
But the problem is, I cant find a good way to Create these:
const __FlashStringHelper MYVAR = F("Some text to be progchared");
Does not compile =/
Now I could probably make some helper method to load them all in, but that is just patching a hack with another hack... Is there any Clean way to do this? So I can use << for all types,
*hws << AT << PLUS << CWMODE << EQUAL << 1 << "\r\n"; //1 and Return break...
1 Answer 1
Is this legal?
typedef const char ProgChar;
ProgChar AT[] = "AT";
I would think that the PROGMEM can't be in the typedef, i.e.:
typedef const char ProgChar;
ProgChar AT[] PROGMEM = "AT";
-
If you meant "Is
typedef const char PROGMEM ProgChar; ProgChar AT[] = "AT";
", legal then apparently it is.typedef const char PROGMEM ProgChar; ProgChar AT[] = "AT"; void setup() { Serial.begin(115200); Serial.println((const __FlashStringHelper *)&AT[0]); } void loop() { ; }
compiles, runs, and produces the expected output.JRobert– JRobert2018年09月26日 15:22:11 +00:00Commented Sep 26, 2018 at 15:22
FPSTR()
. arduino-esp8266.readthedocs.io/en/latest/PROGMEM.htmlstatic const char xyz[] PROGMEM = "This is a string stored in flash"; Serial.println(FPSTR(xyz));