Hi,
ich möchte mehrere Strings zu einem großen String machen, was auch super funktioniert hat. Nachdem ich aber mein Programm weiter geschrieben habe hängt es sich immer an der gleichen Stelle auf, nämlich da wo ich die großen String baue. Hier ist der Codeabschnitt:
Ich komme immer bis "Serial.println(Messung[i]);". Die Stringfunktion muss ein Problem mit dem Aufruf Messung[i] haben, da der Befehl String(Messung[0]) funtioniert.
Welchen Arduino nutzt Du? Und was sind 'große' Strings?
Die String-Klasse ist sehr speicherintensiv, und deshalb kritisch auf den kleinen Arduinos mit wenig RAM. Dort sollte man die eigentlich besser nicht verwenden - sie führt leicht zu einem Speicherüberlauf und dann hakt's. Besser ist es deshalb, mit C-strings zu arbeiten.
Aus deinem Codefragment kann man nichts entnehmen. Was sagt denn der Compiler über die Speichernutzung?
Ich arbeite mit dem Moteino, welcher 16kB RAM hat. Das ist zwar kein offizielles Board von Arduino kann aber mit der Arduino Software programmieren. Mit "großen Strings" meine ich den String den aus den anderen Strings zusammen baue. Der Compiler sagt, dass ich noch genug Speicher habe. Das Codefragment wird in der loop einfach aufgerufen, wenn gewisse Bedingungen erfüllt sind, daher macht es nicht viel Sinn den ganzen Code zu teilen.
Do not use the String class / data type on AVR based MCU's, it is known to cause lockups and other weird behavior. You are also mixing String and (c-)string in your concatenations and that is also problematic.
Das ist zwar blutig Wahr, aber gleichzeitig auch irgendwie uninteressant, da es wegen "unused" gar nicht im Code landet. Der Optimierung zum Opfer fällt.
Ich glaube also nicht, dass das hier das Problem ist.
Repariert gehört es trotzdem!
Keine Frage!
Bei mir läuft die Funktion auf einem UNO!
Perfekt!
Trotz einem ganzen Eimer voll Meldungen:
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino: In function 'void Transceiver(float, float, float)':
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino:24:9: warning: ISO C++ forbids variable length array 'Messung' [-Wvla]
24 | float Messung[Wertelength] = {Temp, Press, Hum};
| ^~~~~~~
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino:26:8: warning: ISO C++ forbids variable length array 'input' [-Wvla]
26 | char input[sendlengthMax];
| ^~~~~
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino:21:15: warning: unused variable 'sendbuffer' [-Wunused-variable]
21 | static char sendbuffer[62];
| ^~~~~~~~~~
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino:22:14: warning: unused variable 'sendlength' [-Wunused-variable]
22 | static int sendlength = 0;
| ^~~~~~~~~~
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino:26:8: warning: unused variable 'input' [-Wunused-variable]
26 | char input[sendlengthMax];
| ^~~~~
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino: At global scope:
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino:22:14: warning: 'sendlength' defined but not used [-Wunused-variable]
22 | static int sendlength = 0;
| ^~~~~~~~~~
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino:21:15: warning: 'sendbuffer' defined but not used [-Wunused-variable]
21 | static char sendbuffer[62];
| ^~~~~~~~~~
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino: In function 'Transceiver(float, float, float)':
E:\Programme\arduino\portable\sketchbook\Combie\Pstr001\Pstr001.ino:26:27: warning: 'sendlengthMax' is used uninitialized [-Wuninitialized]
26 | char input[sendlengthMax];
| ^
Ihm möchte das in einem String zusammenstoppeln, um es an anderer Stelle Auszugeben/weiterzugeben.
Die Serial... sind wohl nur Debugausgaben.
Danke für die vielen Antworten. Die Serial.print Aufrufe dienen nur zum debugen. Der zusammengebaute String soll per funk später an einen anderen Moteino gesendet werden, daher möchte alle 3 Messwerte zu einem String haben um nicht jeden Wert einzeln zu schicken.
Der Ansatz von @combie mit der Klasse sieht nicht schlecht aus. Den werde ich Dienstag oder Mittwoch ausprobieren können, da das kein privates Projekt ist sondern ein HiWi Projekt und ich nicht jeden Tag im Büro bin.