Danke für den Lösungsansatz. Ich werde das als nächstes versuchen, denn zwischenzeitlich habe ich folgendes versucht:
String text = String((char *) &payload[1]);
int speed1 = text.toInt();
Serial.println("text: "+ text);
Serial.println("speed1: "+ speed1);
text enthält den Wert "56"
Bei dem zweiten Serial.println werden nur wahrlose Zeichenfolgen ausgegeben anstatt ebenfalls 56, nur eben als int
Was mache ich da falsch?
Das ganze ist eine Ledstreifen Anwendung um u.a. Geschwindigkeit der Animation und Helligkeit über Schieberegler einzustellen. Der Rückgabewert des Sliders steht in payload mit einem Zeichen als identifier voran. daher payload[1]
Du benutzt blind Strings und erwartest ein anderes Verhalten von der Addition von Pointern.
So funktioniert es mit Strings
byte payload[] = "X56";
void setup() {
Serial.begin(250000);
String text = String((char *) &payload[1]);
int speed1 = text.toInt();
Serial.print("text: ");
Serial.println(text);
Serial.print("speed1: ");
Serial.println(speed1);
}
void loop() {}
Der Sketch verwendet 3338 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 216 Bytes (2%) des dynamischen Speichers, 7976 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.
Man könnte es auch einfacher und viel kleiner machen
byte payload[] = "X56";
void setup() {
Serial.begin(250000);
int speed1 = atoi((char*)payload + 1);
Serial.print("text: ");
Serial.println((char*)payload + 1);
Serial.print("speed1: ");
Serial.println(speed1);
}
void loop() {}
Der Sketch verwendet 2120 Bytes (0%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 206 Bytes (2%) des dynamischen Speichers, 7986 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.
Das sind 1200 Byte Unterschied im Flashverbrauch.
Editt: Und man sieht, dass überhaupt Strings zu benutzen noch einen RAM Overhead von 10 Bytes erzeugt.
Auf AVR-8-Bit Arduinos sollte man Strings nicht benutzen...
Whandall:
Du ... erwartest ein anderes Verhalten von der Addition von Pointern.
Das z.B. ist eine solche:
Serial.println("speed1: "+ speed1);
Um das zu veranschaulichen: (nicht an dem verspäteten begin stören, das ist Absicht)
char dummyText[] = "ABCDEFG";
char testText[] = "abcdefg";
void setup() {
Serial.println(dummyText);
Serial.begin(250000);
for (byte i = 0; i < 2 * sizeof(testText); i++) {
Serial.print(F("i = "));
if (i < 10) {
Serial.write(' ');
}
Serial.print(i);
Serial.print(F(", ergibt '"));
Serial.print(testText + i);
Serial.println(F("'"));
}
}
void loop() {}
i = 0, ergibt 'abcdefg'
i = 1, ergibt 'bcdefg'
i = 2, ergibt 'cdefg'
i = 3, ergibt 'defg'
i = 4, ergibt 'efg'
i = 5, ergibt 'fg'
i = 6, ergibt 'g'
i = 7, ergibt ''
i = 8, ergibt 'ABCDEFG'
i = 9, ergibt 'BCDEFG'
i = 10, ergibt 'CDEFG'
i = 11, ergibt 'DEFG'
i = 12, ergibt 'EFG'
i = 13, ergibt 'FG'
i = 14, ergibt 'G'
i = 15, ergibt ''
Nochmals vielen Dank. Nun klappt es endlich
Die String Klasse kann nichts was man nicht auch anders erledigen kann. Gerade bei Konvertierung und Formatierung ist sie extrem eingeschränkt. Es ist also Irrsinn etwas in ein String Objekt zu konvertieren und nur um z.B. toInt() zu verwenden. Die einzigen Vorteile gibt es beim Konkatenieren von Strings und darauf kann man oft verzichten.
Das ist auch kein exotisches Wissen. Hier werden auch nur C Funktionen (größtenteils Standard) verwendet die es seit Jahrzehnten gibt und die gut dokumentiert sind. atoi() ist keine Arduino- oder AVR-spezifische Angelegenheit. Ähnliche Konvertierungsfunktionen gibt es für anderen Datentypen und auch in die andere Richtung (Zahl -> C String).
Dass du Text empfängst und nicht Binärdaten musst du bei sowas aber sagen. Kann sein, dass irgendwo vorher aus dem Code ersichtlich war, aber das sind zwei verschiedene Sachen.