versuch's mal in der Funktion "function2()" mit einem 'static' vor char tmp[10].
Wenn's dann klappt, liegt es daran:
"Zeiger auf lokale Variablen darfst du auf keinen Fall zurückgeben. tmp beispielsweise liegt auf dem Stack, solange die Funktion nicht verlassen wird. Sobald dies jedoch geschieht (nach dem return), wird sie freigeben. Der zurückgegebene Zeiger, der vorher noch auf tmp zeigte, ist nun ungültig. Er zeigt nun wahrscheinlich auf irgendwelchen Datenschrott (es kann natürlich sein, dass die alten Werte von tmp noch nicht überschrieben sind, aber das ist nur Zufall)."
Mit dem Schlüsselwort 'static' wird u.a. die Variable nicht auf dem Stack abgelegt.
Oder vielleicht so (puffer ausserhalb von function2() anlegen und Pointer an Funktion übergeben):
void setup(){
Serial.begin(9600);
}
char puffer[10]; // Pufferbereich nicht in function2() anlegen, sondern hier
void loop() {
char* ReturnValue = function2(puffer); // Pointer auf Puffer an function2() übergeben
// Pointer jetzt immer noch gültig
Serial.println("3====");
Serial.println(ReturnValue); // aber hier kann man natürlich direkt Serial.println(puffer); schreiben
// function3(puffer); // Alternative ohne char* als Returnwert der Funktion
// Serial.println(puffer);
Serial.println("4====");
delay(5000);
}
char* function2(char* tmp) {
int TestValue = 2010;
sprintf(tmp, "%d", TestValue);
Serial.println("1====");
Serial.println(TestValue);
Serial.println("2====");
Serial.println( tmp );
return tmp;
}
void function3(char* tmp) {
int TestValue = 2010;
sprintf(tmp, "%d", TestValue); // schreibt über Pointer in puffer[10];
Serial.println("1====");
Serial.println(TestValue);
Serial.println("2====");
Serial.println( tmp );
}