Più volte, su questo forum, abbiamo sconsigliato la classe "String" per i vari problemi che essa provoca.
Il commento di "SparkFun" sulla classe "String" è, più o meno, il segunete: "la classe String (con 'S' maiuscola) in Arduino utilizza una grande quantità di memoria e tende a causare svariati problemi su progetti si una certa dimensione. tale clsasse dovrebbe essere fortemente evitata nella scrittura di librerie".
Similmente "Adafruit" all'incirca così commenta: "Nella maggior parte degli utilizzi, molti altri piccoli oggetti String vengono temporaneamente utilizzati forzando la nuova allocazione delle stringhe in una nuova area dell'heap e lasciando un grosso buco dove si trovava quello precedente (frammentazione della memoria)."
Noi stessi abbiamo più volte segnalato agli utenti che utilizzavano la classe "String": "NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!!"
Sempre "Adafruit" da una chiara rappresentazione grafica del problema ...
... e suggersice, come almeno primo palliativo per evitare il crash, quello di usare il metodo String.reserve () che, se impedisce la frammentazione dell'heap, non fa nulla e non riduce l'utilizzo eccessivo della memoria.
Inoltre, anche se si evita la frammentazione del "heap", la continua creazione di oggetti "String" e la copia di stringhe all'interno di essi (e tra di loro), è cosa estremamente lenta.