Utilizzo di "String"

Ciao a tutti,
in alcuni dei miei progetti Arduino e ESP8266, tendo a utilizzare “String” in determinate situazioni.

Leggevo che è comunque sconsigliato per un tema di allocazione della memoria… Avete qualche consiglio in merito?

Vi pubblico due funzioni di esempio e premetto che funziona tutto correttamente.

Esempio 1: funzione che legge un RFID attraverso modulo MFRC522

String getRFID(byte *buffer, byte bufferSize) {
  String id = "";
  for (byte i = 0; i < bufferSize; i++) {
    id += buffer[i] < 0x10 ? "0" : "";
    id += String(buffer[i], HEX);
  }
  return id;
}

Esempio 2: con ESP8266… funzione che fa una richiesta _GET ad un webserver

void getRequest(String getName, String getValue) {
  
  WiFiClient client;
  if (!client.connect(host, httpPort)) {
    Serial.println("Connection to the web server failed");
    return;
  }
  
  String url = "/test.php";
  url += "?";
  url += getName;
  url += "=";
  url += getValue;
 
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  unsigned long clientTimeout = millis();
  while (client.available() == 0) {
    if (millis() - clientTimeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  client.flush();
  client.stop(); 

}

Per il secondo esempio, adesso utilizzo string perchè la funzione è volutamente generica e potrei passare un intero così come una stringa… Se ad esempio passo un intero, la richiamo ad esempio così:

         String millisStr = String(millis());
         getRequest("millis", millisStr)

Lascio così o sconsigliate anche voi l’utilizzo di String anche in questi casi generici?

Grazie

Ricorda che …

NON sei su un PC dove c’è un sistema operativo ed un “garbage collector”, su Arduino 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 !!! :smiling_imp:

Impara ad usare le stringhe classiche del C … ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (… che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h> :wink:

Otterrai codice più efficiente, veloce e … meno problemi :smiley: :smiley: :smiley:

Guglielmo

Grazie per la risposta.. di solito programmo su PC quindi non mi sono mai posto il problema.

Che modifiche faresti sul mio secondo esempio?
Anche usando char*, ho qualche difficoltà ad esempio a convertire un unsigned long in char*.. (in questo la funzione String(); aiutava parecchio :stuck_out_tongue: ).

Ho cercato online parecchie soluzioni ma niente sembra funzionare come spero per avere una soluzione flessibile. Idee? Grazie

GiuMex:
Anche usando char*, ho qualche difficoltà ad esempio a convertire un unsigned long in char*

… hai cercato, ma … non ti sei STUDIATO la AVR libc come ti ho indicato … :smiling_imp:

<stdlib.h> … funzione ultoa()buono studio !

Guglielmo