Ich wollte mal die Variante mit und ohne PROGMEM vergleichen, um zu sehen, was das bringt, leider meckert der Compiler (UNO, IDE 1.6.5, Sketch aus #7):
In function 'void processCmd(const char*)':
39: error: invalid conversion from 'uint16_t {aka unsigned int}' to 'const char*' [-fpermissive]
invalid conversion from 'uint16_t {aka unsigned int}' to 'const char*' [-fpermissive]
const byte r2rLadder[] = { 2, 3, 4, 5, 6, 7, 8, 9 }; // die kleinen Wertigkeiten zuerst
void setup() {
for (byte idx = 0; idx < sizeof(r2rLadder); idx++) {
pinMode(r2rLadder[idx], OUTPUT);
}
Serial.begin(9600);
Serial.println(F("Ich kenne folgende Kommandos: CURR TIME VOLT STOP"));
}
void loop() {
serialHandler();
}
void processCmd(const char* buf)
{
if (memcmp( buf, "CURR", 4) == 0) {
cmdCurr(buf + 4);
return;
}
if (memcmp( buf, "TIME", 4) == 0) {
cmdTime(buf + 4);
return;
}
if (memcmp( buf, "VOLT", 4) == 0) {
cmdVolt(buf + 4);
return;
}
if (memcmp( buf, "STOP", 4) == 0) {
cmdStop(buf + 4);
return;
}
Serial.write('\'');
Serial.print(buf);
Serial.println(F("' nicht erkannt"));
}
void cmdCurr(const char* parms) {
unsigned long value = strtoul(parms, (char**)&parms, 0);
while (*parms == ' ') {
parms++;
}
if (*parms == 'A') {
value *= 1000;
}
Serial.print(F("Current: "));
Serial.print(value);
Serial.println(F(" mA"));
}
void cmdTime(const char* parms) {
unsigned long value = strtoul(parms, (char**)&parms, 0);
while (*parms == ' ') {
parms++;
}
if (!strncasecmp_P(parms, PSTR("min"), 3)) {
value *= 60000L;
} else if (!strncasecmp_P(parms, PSTR("se"), 2)) {
value *= 1000;
} else if (!strncasecmp_P(parms, PSTR("st"), 2)) {
value *= 60 * 60000L;
} else if (!strncasecmp_P(parms, PSTR("ze"), 2)) {
value *= 100;
} else if (!strncasecmp_P(parms, PSTR("hu"), 2)) {
value *= 10;
// } else if (!strncasecmp_P(parms, PSTR("mil"), 3)) {
} else {
value *= 1000;
}
Serial.print(F("Time: "));
Serial.print(value);
Serial.println(F(" ms"));
}
void cmdVolt(const char* parms) {
unsigned long value = strtoul(parms, (char**)&parms, 0);
while (*parms == ' ') {
parms++;
}
if (*parms == 'V') {
value *= 1000;
}
Serial.print(F("Voltage: "));
Serial.print(value);
Serial.println(F(" mV"));
if (value > 5000) {
value = 5000;
}
unsigned int ladderValue = map(value, 0, 5000, 0, (1 << sizeof(r2rLadder)) - 1);
Serial.print(F("Muster: 0b"));
Serial.println(ladderValue, BIN);
int mask = 1;
for (byte idx = 0; idx < sizeof(r2rLadder); idx++) {
digitalWrite(r2rLadder[idx], ladderValue & mask);
mask <<= 1;
}
}
void cmdStop(const char* parms) {
for (byte idx = 0; idx < sizeof(r2rLadder); idx++) {
digitalWrite(r2rLadder[idx], LOW);
}
Serial.print(F("Stopp "));
Serial.println(parms);
}
void serialHandler()
{
const byte sCBMax = 30;
static char sCBuffer[sCBMax];
static byte buffIndex = 0;
byte inChar;
bool doCheck = false;
while (Serial.available()) {
inChar = Serial.read();
if (inChar == 13) {
doCheck = true;
} else if (inChar != 10) {
if ((buffIndex == 0) && isWhitespace(inChar)) {
continue;
}
sCBuffer[buffIndex++] = inChar;
doCheck = (buffIndex == (sCBMax - 1));
}
if (doCheck) {
sCBuffer[buffIndex] = 0;
doCheck = false;
if (buffIndex != 0) {
processCmd(sCBuffer);
buffIndex = 0;
} else {
Serial.println();
}
}
}
}
Der Sketch verwendet 4.740 Bytes (14%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 265 Bytes (12%) des dynamischen Speichers, 1.783 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.