Da mir nahegelegt wurde, define sollte man so weit es geht reduzieren...
Ich möchte ein string "CK", der aktuell per define angelegt ist, zu const char PROGMEM ändern.
aber die Ausgabe dessen ist dann völliger mist.
Ohne PROGMEM klappt es, aber war nicht das Ziel.
Wisst ihr wieso?
#define CK F("CK") // good
//const char CK[] PROGMEM = {"CK"}; // bad result
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
while (!Serial) {
; // wait for serial ports to connect. Needed for native USB port only
}
Serial.print(F("CKSTRING:"));
Serial.println(CK);
}
Das geht natürlich schief. Die Print Klasse kann nicht wissen dass der String nur im Flash steht. Genau deshalb gibt es ja das F()-Makro! Dabei wird der String auf eine Klasse gecastet von der nur eine Deklaration existiert. Einfach damit man einen anderen Datentyp hat
Ja, Weil deine Zeiger ins RAM zeigen, die Adresse aber eine Flash Adresse ist.
Experiment:
const char CK[] PROGMEM = "Check";
void setup() {
Serial.begin(9600);
while (!Serial); // wait for serial ports to connect. Needed for native USB port only
Serial.print(F("CKSTRING: "));
Serial.println((__FlashStringHelper*)CK);
}
void loop(){}
#define FPSTR(str) reinterpret_cast<const __FlashStringHelper*>(str)
const char CK[] PROGMEM = "Check";
void setup()
{
Serial.begin(9600);
while (!Serial); // wait for serial ports to connect. Needed for native USB port only
Serial.print(F("CKSTRING: "));
Serial.println(FPSTR(CK));
}
void loop(){}
#include <Streaming.h>
constexpr const __FlashStringHelper *f(const char *str)
{
return reinterpret_cast<const __FlashStringHelper*>(str);
}
const char cs[] PROGMEM = "CKSTRING: ";
const char ck[] PROGMEM = "Check";
void setup()
{
Serial.begin(9600);
while (!Serial); // wait for serial ports to connect. Needed for native USB port only
Serial << "Start" << endl
<< f(cs) << f(ck) << endl
<< F("Date: ") << __DATE__ << endl
<< F("File: ") << __FILE__ << endl;
}
void loop(){}
Es gibt grundsätzlich nur 2 Möglichkeiten...
Entweder sorgst du dafür, dass Print erfährt, dass es einen Pointer ins Flash bekommt, oder holst den String selber aus dem Flash.