Auslesen eine Strings wird unterbrochen

Hallo in die Runde,
ich bin am verzweifeln,
Ich habe eine Sting Arry gebaute in dem Texte gespeichert sind. 56 Stück.
Wenn ich diese Auslese bekomme ich ab ab einer bestimmten zahl keien werte zurück.

String MenuItems[] = {  
  "Geladen   Anzahl",
  "Ausschalten",
  "Lade Preset A",
  "Lade Preset B",
  "Lade Preset C",
  "Preset A 1B",
  "Preset A 1C",
  "Preset A 2B",
  "Preset A 2C",
  "Preset A 2D",
  "Preset A 2E",
  "Preset A 3A",
  "Preset A 3C",
  "Preset A 3D",
  "Preset A 3E",
  "Preset A 4B",
  "Preset A 4C",
  "Preset A 4D",
  "Preset A 4E",
  "Preset A 5B",
  "Preset A 5C",
  "Preset A 5D",
  "Preset B 1B",
  "Preset B 1C",
  "Preset B 2B",
  "Preset B 2C",
  "Preset B 2D",
  "Preset B 2E",
  "Preset B 3A",
  "Preset B 3C",
  "Preset B 3D",
  "Preset B 3E",
  "Preset B 4B",
  "Preset B 4C",
  "Preset B 4D",
  "Preset B 4E",
  "Preset B 5B",
  "Preset B 5C",
  "Preset B 5D",
  "Preset C 1B",
  "Preset C 1C",
  "Preset C 2B",
  "Preset C 2C",
  "Preset C 2D",
  "Preset C 2E",
  "Preset C 3A",
  "Preset C 3C",
  "Preset C 3D",
  "Preset C 3E",
  "Preset C 4B",
  "Preset C 4C",
  "Preset C 4D",
  "Preset C 4E",
  "Preset C 5B",
  "Preset C 5C",
  "Preset C 5D",
  };


int i = 0;
void setup() {
  
Serial.begin(57600);

 
}

void loop() {
 

if (i>  55){
  i=0;
}


Serial.print("Nummer:");
Serial.print(i);  
Serial.print(" ");
Serial.println(MenuItems[i]);
i=i+1;
delay(300);


}

im Serialmonitor läuft alles duch bis zum punkt 45 "Preset 3a", danach
bekomme ich keine Daten mehr aus dem Sting angzeigt. Waran liegt es ?
gibt es eine Maximal Größe die ich in einen Sting speichen kann? (dazu habe versucht etwas rauszubekommen ... leider ohne wirkliche erfolge)

20:50:48.270 -> Nummer:0 Geladen   Anzahl
20:50:48.550 -> Nummer:1 Ausschalten
20:50:48.870 -> Nummer:2 Lade Preset A
20:50:49.150 -> Nummer:3 Lade Preset B
20:50:49.470 -> Nummer:4 Lade Preset C
20:50:49.750 -> Nummer:5 Preset A 1B
20:50:50.070 -> Nummer:6 Preset A 1C
20:50:50.360 -> Nummer:7 Preset A 2B
20:50:50.680 -> Nummer:8 Preset A 2C
20:50:50.959 -> Nummer:9 Preset A 2D
20:50:51.250 -> Nummer:10 Preset A 2E
20:50:51.570 -> Nummer:11 Preset A 3A
20:50:51.860 -> Nummer:12 Preset A 3C
20:50:52.180 -> Nummer:13 Preset A 3D
20:50:52.479 -> Nummer:14 Preset A 3E
20:50:52.770 -> Nummer:15 Preset A 4B
20:50:53.050 -> Nummer:16 Preset A 4C
20:50:53.370 -> Nummer:17 Preset A 4D
20:50:53.650 -> Nummer:18 Preset A 4E
20:50:53.970 -> Nummer:19 Preset A 5B
20:50:54.250 -> Nummer:20 Preset A 5C
20:50:54.570 -> Nummer:21 Preset A 5D
20:50:54.850 -> Nummer:22 Preset B 1B
20:50:55.170 -> Nummer:23 Preset B 1C
20:50:55.450 -> Nummer:24 Preset B 2B
20:50:55.770 -> Nummer:25 Preset B 2C
20:50:56.050 -> Nummer:26 Preset B 2D
20:50:56.370 -> Nummer:27 Preset B 2E
20:50:56.650 -> Nummer:28 Preset B 3A
20:50:56.970 -> Nummer:29 Preset B 3C
20:50:57.250 -> Nummer:30 Preset B 3D
20:50:57.570 -> Nummer:31 Preset B 3E
20:50:57.949 -> Nummer:32 Preset B 4B
20:50:58.187 -> Nummer:33 Preset B 4C
20:50:58.559 -> Nummer:34 Preset B 4D
20:50:58.780 -> Nummer:35 Preset B 4E
20:50:59.080 -> Nummer:36 Preset B 5B
20:50:59.360 -> Nummer:37 Preset B 5C
20:50:59.680 -> Nummer:38 Preset B 5D
20:50:59.960 -> Nummer:39 Preset C 1B
20:51:00.280 -> Nummer:40 Preset C 1C
20:51:00.560 -> Nummer:41 Preset C 2B
20:51:00.880 -> Nummer:42 Preset C 2C
20:51:01.160 -> Nummer:43 Preset C 2D
20:51:01.480 -> Nummer:44 Preset C 2E
20:51:01.770 -> Nummer:45 Preset C 3A
20:51:02.050 -> Nummer:46 
20:51:02.370 -> Nummer:47 
20:51:02.650 -> Nummer:48 
20:51:02.970 -> Nummer:49 
20:51:03.250 -> Nummer:50 
20:51:03.569 -> Nummer:51 
20:51:03.850 -> Nummer:52 
20:51:04.170 -> Nummer:53 
20:51:04.450 -> Nummer:54 
20:51:04.770 -> Nummer:55 

Würde mich freuen über einen tipp.
Danke und Viele Grüße
Johann

Welcher Prozessor? Evtl. geht Dir der RAM aus.

Gruß Tommy

Auf einem UNO ist das Verhalten reproduzierbar.

Mit

const char * MenuItems[] = {  

sieht es besser aus.

Wenn die konstant sind, könnte man die auch in den PROGMEM legen.
Da muss der TO aber noch ein paar Infos liefern

Gruß Tommy

Möglicherweise kann man es sich auch sparen durch Kombination mit Einzelwörtern 54 mal das Wort Preset, A B und C usw. zu speichern und kann dadurch einiges an Speicherverbrauch reduzieren.

Ja, da dürfte noch viel machbar sein. Um das aber genauer abzuchecken braucht es (wie fast immer) mehr Infos vom TO, nicht nur ein Codefragment.

Gruß Tommy

einfach keine Arduino Strings verwenden, dann braucht man nicht verzweifeln.

constexpr char * MenuItems[] = {
  "Geladen   Anzahl",
  "Ausschalten",
  "Lade Preset A",
  "Lade Preset B",
  "Lade Preset C",
  "Preset A 1B",
  "Preset A 1C",
  "Preset A 2B",
  "Preset A 2C",
  "Preset A 2D",
  "Preset A 2E",
  "Preset A 3A",
  "Preset A 3C",
  "Preset A 3D",
  "Preset A 3E",
  "Preset A 4B",
  "Preset A 4C",
  "Preset A 4D",
  "Preset A 4E",
  "Preset A 5B",
  "Preset A 5C",
  "Preset A 5D",
  "Preset B 1B",
  "Preset B 1C",
  "Preset B 2B",
  "Preset B 2C",
  "Preset B 2D",
  "Preset B 2E",
  "Preset B 3A",
  "Preset B 3C",
  "Preset B 3D",
  "Preset B 3E",
  "Preset B 4B",
  "Preset B 4C",
  "Preset B 4D",
  "Preset B 4E",
  "Preset B 5B",
  "Preset B 5C",
  "Preset B 5D",
  "Preset C 1B",
  "Preset C 1C",
  "Preset C 2B",
  "Preset C 2C",
  "Preset C 2D",
  "Preset C 2E",
  "Preset C 3A",
  "Preset C 3C",
  "Preset C 3D",
  "Preset C 3E",
  "Preset C 4B",
  "Preset C 4C",
  "Preset C 4D",
  "Preset C 4E",
  "Preset C 5B",
  "Preset C 5C",
  "Preset C 5D",
};


int i = 0;
void setup() {

  Serial.begin(115200);


}

void loop() {


  if (i >  55) {
    i = 0;
  }


  Serial.print("Nummer:");
  Serial.print(i);
  Serial.print(" ");
  Serial.println(MenuItems[i]);
  i = i + 1;
  delay(300);


}

läuft durch.

Sketch uses 2752 bytes (8%) of program storage space. Maximum is 32256 bytes.
Global variables use 994 bytes (48%) of dynamic memory, leaving 1054 bytes for local variables. Maximum is 2048 bytes.

Hingegen mit Arduino-String
Sketch uses 4642 bytes (14%) of program storage space. Maximum is 32256 bytes.
Global variables use 1228 bytes (59%) of dynamic memory, leaving 820 bytes for local variables. Maximum is 2048 bytes.

Den hatten wir schon :slight_smile: Aber:

Das geht besser :wink:

Der Sketch verwendet 2678 Bytes (8%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 983 Bytes (47%) des dynamischen Speichers, 1065 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Aber wie @Tommy56 schon schrieb, ohne Infos was das wird, ist das alles stochern im Nebel.
Ich sehe da eine z.B. eine Ausgabe von einem Lichtpult...

@1234_BEL was wird das?
Dreist wenn da jetzt ne Handvoll bytes frei werden um Dir die Ausgabe zu ermöglichen, solltest Du erklären was das wird - sonst hast Du nach den nächsten 10 Zeilen Code das nächste Problem.

was anderes geht immer:

Sketch uses 2972 bytes (9%) of program storage space. Maximum is 32256 bytes.
Global variables use 190 bytes (9%) of dynamic memory, leaving 1858 bytes for local variables. Maximum is 2048 bytes.

Hallo danke für die schnelle hilfe

@ Tommy56

es handelt sich um einen Nano 328P

@ agmue

Mit deien Vorschalg

const char * MenuItems[] = {  

funktioniert es !! Super Danke

@ Kai-R
Du hast Vollkommen recht. das ganze kann noch Kompakter und "in sich Verschachtelt werden ... es "war" sozusagen der Erste schritt ... Optimieren und einsparen kommt jetzt.

Danke für eure schnelle und super hilfe.

An die andern natürich auch ein dank für Ihre Hilfe,

@my_xy_projekt ja so was inder Art, es soll ein einfaches Menu werden. in dem einige Schalter die überwacht werden sollen an und aus geschalten werden können, und über DMX dann weitergeben werden sollen, das ganze in 3 Presets (A, B ,C,)
mit dem
const char

funktioniert es auch jezte alles ganz gut ...

ihr habt mich auf jeden fall auf das RAM problem aufmerksamm gemacht .
ich versuche mich da mal weiter einzulesen

=)

Habt einen schöne Nacht.
Viele Grüße
Johann

Hat mich meine Bühnenerfahrung nicht im Stich gelassen...
Und ja: Da gibt es noch gaaanz viel Optimierungsmöglichkeiten um die serielle Ausgabe nicht so Speicherintensiv zu machen.

Bevor Du Ausgaben machst, baue Dir einen Plan und arbeite das ganz ohne Texte ab.

Bitte gerne!

Da meist mehr Programmspeicher als dynamischen Speicher zur Verfügung steht, kann man, wie bereits erwähnt, viel Text dorthin verlagern. Besonders ein Feld von Text in PROGMEM eignet sich gut, wenn man es denn mal im Griff hat:

#include <avr/pgmspace.h>

const char MenuItem_00[] PROGMEM = "Geladen   Anzahl";
const char MenuItem_01[] PROGMEM = "Ausschalten";
const char MenuItem_02[] PROGMEM = "Lade Preset A";
const char MenuItem_03[] PROGMEM = "Lade Preset B";
const char MenuItem_04[] PROGMEM = "Lade Preset C";
const char MenuItem_05[] PROGMEM = "Preset A 1B";
const char MenuItem_06[] PROGMEM = "Preset A 1C";
const char MenuItem_07[] PROGMEM = "Preset A 2B";
const char MenuItem_08[] PROGMEM = "Preset A 2C";
const char MenuItem_09[] PROGMEM = "Preset A 2D";
const char MenuItem_10[] PROGMEM = "Preset A 2E";
const char MenuItem_11[] PROGMEM = "Preset A 3A";
const char MenuItem_12[] PROGMEM = "Preset A 3C";
const char MenuItem_13[] PROGMEM = "Preset A 3D";
const char MenuItem_14[] PROGMEM = "Preset A 3E";
const char MenuItem_15[] PROGMEM = "Preset A 4B";
const char MenuItem_16[] PROGMEM = "Preset A 4C";
const char MenuItem_17[] PROGMEM = "Preset A 4D";
const char MenuItem_18[] PROGMEM = "Preset A 4E";
const char MenuItem_19[] PROGMEM = "Preset A 5B";
const char MenuItem_20[] PROGMEM = "Preset A 5C";
const char MenuItem_21[] PROGMEM = "Preset A 5D";
const char MenuItem_22[] PROGMEM = "Preset B 1B";
const char MenuItem_23[] PROGMEM = "Preset B 1C";
const char MenuItem_24[] PROGMEM = "Preset B 2B";
const char MenuItem_25[] PROGMEM = "Preset B 2C";
const char MenuItem_26[] PROGMEM = "Preset B 2D";
const char MenuItem_27[] PROGMEM = "Preset B 2E";
const char MenuItem_28[] PROGMEM = "Preset B 3A";
const char MenuItem_29[] PROGMEM = "Preset B 3C";
const char MenuItem_30[] PROGMEM = "Preset B 3D";
const char MenuItem_31[] PROGMEM = "Preset B 3E";
const char MenuItem_32[] PROGMEM = "Preset B 4B";
const char MenuItem_33[] PROGMEM = "Preset B 4C";
const char MenuItem_34[] PROGMEM = "Preset B 4D";
const char MenuItem_35[] PROGMEM = "Preset B 4E";
const char MenuItem_36[] PROGMEM = "Preset B 5B";
const char MenuItem_37[] PROGMEM = "Preset B 5C";
const char MenuItem_38[] PROGMEM = "Preset B 5D";
const char MenuItem_39[] PROGMEM = "Preset C 1B";
const char MenuItem_40[] PROGMEM = "Preset C 1C";
const char MenuItem_41[] PROGMEM = "Preset C 2B";
const char MenuItem_42[] PROGMEM = "Preset C 2C";
const char MenuItem_43[] PROGMEM = "Preset C 2D";
const char MenuItem_44[] PROGMEM = "Preset C 2E";
const char MenuItem_45[] PROGMEM = "Preset C 3A";
const char MenuItem_46[] PROGMEM = "Preset C 3C";
const char MenuItem_47[] PROGMEM = "Preset C 3D";
const char MenuItem_48[] PROGMEM = "Preset C 3E";
const char MenuItem_49[] PROGMEM = "Preset C 4B";
const char MenuItem_50[] PROGMEM = "Preset C 4C";
const char MenuItem_51[] PROGMEM = "Preset C 4D";
const char MenuItem_52[] PROGMEM = "Preset C 4E";
const char MenuItem_53[] PROGMEM = "Preset C 5B";
const char MenuItem_54[] PROGMEM = "Preset C 5C";
const char MenuItem_55[] PROGMEM = "Preset C 5D";

const char * const menu_table[] PROGMEM = {
  MenuItem_00, MenuItem_01, MenuItem_02, MenuItem_03, MenuItem_04, MenuItem_05, MenuItem_06, MenuItem_07, MenuItem_08, MenuItem_09,
  MenuItem_10, MenuItem_11, MenuItem_12, MenuItem_13, MenuItem_14, MenuItem_15, MenuItem_16, MenuItem_17, MenuItem_18, MenuItem_19,
  MenuItem_20, MenuItem_21, MenuItem_22, MenuItem_23, MenuItem_24, MenuItem_25, MenuItem_26, MenuItem_27, MenuItem_28, MenuItem_29,
  MenuItem_30, MenuItem_31, MenuItem_32, MenuItem_33, MenuItem_34, MenuItem_35, MenuItem_36, MenuItem_37, MenuItem_38, MenuItem_39,
  MenuItem_40, MenuItem_41, MenuItem_42, MenuItem_43, MenuItem_44, MenuItem_45, MenuItem_46, MenuItem_47, MenuItem_48, MenuItem_49,
  MenuItem_50, MenuItem_51, MenuItem_52, MenuItem_53, MenuItem_54, MenuItem_55
};

byte i = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (i >  55) {
    i = 0;
  }
  char buf[20]; // Der Buffer zum Lesen der Daten muss so lang sein wie der längste String!
  strcpy_P(buf, (char*)pgm_read_word(&(menu_table[i]))); // Casts und Dereferenzierung des Speichers
  Serial.print("Nummer:");
  Serial.print(i);
  Serial.print(" ");
  Serial.println(buf);
  i = i + 1;
  delay(300);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.