Seriale: meglio array di char o String ottimizzate?

Buona sera a tutti,
Sapendo che un MCU non ha un garbage collector, per la ricezione di comandi in seriale è meglio utilizzare un array di char cosi’:

int inputSize = 0;
char myCmd[20];
void setup(){}
void loop()
{
  if (Serial.available())
  {
    inputSize = Serial.available();
    for (int i = 0; i < inputSize; i++)
      myCmd[i] = Serial.read();
    if (myCmd[0] == 'o') if (myCmd[1] == 'n')
      {
        //codice da eseguire
      }
  }
}

oppure va bene anche utilizzare la classe String ottmizzata in questo modo:

String comando;
void setup() {}
void loop()
{
  if (mySerial.available() > 0)
  {
    comando = mySerial.readString();
    comando.trim();
  }
  if (comando.indexOf("on") > -1)
  {
    comando.remove(0, 2);
    comando.trim();
    //codice da eseguire
  }
}

Grazie!

array! Ogni operazione sulle String produce potenziale frammentazione perchè tende a salvare il risultato in un posto differente lasciando libero il precedente. Non è che trimmare gli spazi aiuti, anzi, a mio avviso può solo peggiorare. Non è un compattatore di memoria.

Maurizio

Come ti hanno detto gli oggetti string creano frammentazione della memoria! Ma penso che dovresti riflettere se usare o no le stringhe. Inviare una stringa come comando è inutile per arduino, puoi inviare semplicemente un byte e in base al suo valore fare qualcosa. Ossia inviare ad arduino la stringa "on" o inviare ad arduino il byte con valore 65, ottieni lo stesso risultato, il codice diviene più semplice. Tieni presente che arduino "capisce meglio" un byte che una stringa :)

Gianky00:
Sapendo che un MCU non ha un garbage collector …

Non lo hanno né le MCU né le CPU … è una parte implementata nei vari “Sistemi Operativi” e … su Arduino NON c’è un “Sistema Operativo” che gira e che fa tante cose, ma devi fare TU tutto a mano :wink:

Guglielmo

ringrazio a tutti per le risposte, come sempre esaustive ;)