Riprendendo un precedente articolo su Arduino e le strighe oggi ti racconto di un test che ho eseguito nei giorni scorsi e che mi ha risolto molti problemi proprio nelle conversioni da char a string e viceversa.
Problema:
Vorresti poter applicare uno dei metodi dell’oggetto String ad una variabile di tipo char, ad esempio estrarre solo una parte della stringa (substring).
I metodi dell’oggetto String puoi applicarli solo a variabili di questo tipo, per cui se hai una variabile di tipo char o char* devi convertire in string il suo contenuto per potervi applicare uno dei metodi.
Soluzione:
Guarda lo script sotto, in cui ho definito delle variabilidi tipo char e string per poter eseguire le conversioni necessarie:
char *mystr; String miastringa; void setup() { Serial.begin(9600); mystr = "Testo di prova"; } void loop() { miastringa = String(mystr); Serial.println(miastringa.substring(0,5)); }
analizziamo il codice linea per linea:
linea 01: definisci una variabile di tipo char* che simula la tua variabile da convertire;
linea 02: definisci una variabile di tipo String, che accoglierà la stringa convertita e su sui applicherai il metodo substring;
linea 04: crea la funzione setup(), di tipo void;
linea 05: inizializza la comunicazione seriale, la utilizzerà per visualizzare il risultato del metodo substring;
linea 06: assegno un valore alla variabile mystr, questa variabile nel tuo sketch è quella a tua disposizione durante il loop(), in questo esempio la definisci alla linea 01 e la valorizzi nella setup() solo a titolo di esempio;
linea 10: crea la funzione loop(), eseguita cilicamente durante tutto il funzionamento dello sketch;
linea 12: esegue la conversione vera e propria, sfruttando il costruttore del’oggetto String assegno alla variabile miastringa il valore della variabile mystr;
linea 13: scrive sul monitor seriale dell’IDE Arduino il risultato del metodo substring, in questo esempio il risultato sarà la parola Testo.
Ringrazio Luca per avermi illuminato sulla possibilità di convertire i tipi char in String sfruttando il costruttore dell’oggetto String.
Buon lavoro
14 commenti
Vai al modulo dei commenti
Ciao Mauro,
vorrei ringraziarti per la chiarissima spiegazione !
Complimenti per l’analisi dettagliata.
Buon lavoro anche a te !
Marco
Ciao Mauro,
Continuo con la lettura del tuo corso arduino che trovo davvero eccezionale e volevo sollevare una domanda; magari può servire a chi come me sta cominciando con arduino ed anche per capirne io un po’ di più. Provando il codice postato per convertire char–> string il simulatore vede “char* mystring” già come una stringa e non come ad esempio un array di char. Per fare ciò ho fatto una piccola modifica ma non capisco se doveva essere questo il risultato voluto… ( sperando che non mi spuntano i mostri sul codice che posto..)
Nota comportamentale del simulatore (V. 098A)
– Non riconosce il metodo ToCharArray ( anche con gli esempi forniti dall’IDE dà errore )
– Non riconosce la dichiarazione char[] ( vuole il numero di char )
void loop()
{
char mystr[29]= “ecco l’Array char[] di prova”;
String miastringa;
Serial.println(mystr);
miastringa = String(mystr);
String str = miastringa.substring(0,5);
Serial.println(“ed ecco la sub stringa String—->” + str);
while(true);
}
Buona giornata e sempre complimentissimi!
ciao Mauro e compliementi per le guide di arduino!
Vorrei poi farti una domanda, come faccio a leggere la stringa proveniente da un server con la funzione “client.read”?
perche io lo faccio dichiarando una variabile c come char e leggendo, tuttavia mi ritrovo ad avere i cinqie valori che il server invia ma non in un array come vorrei io e tanto meno come una stringa, quindi come potrei fare?
grazie mille!
Autore
Ciao Pizz,
ti consiglio di leggere il tutorial sui led RGB via Web in cui ho analizzato la stringa in GET e definito come devi trattarla.
Ciao Mauro.
Mi sto imbattendo in un problema che mi crea molta confusione tra chart e string.
Dovrei scrivere su una riga del display LCD 20 caratteri formato da variabili che vanno visualizzate, e queste variabili hanno tre-quattro caratteri “speciali”.
Come creare i caratteri speciali ci arrivo, però poi pensavo di creare un “buffer” dove inserirli e poi mandarli in visualizzazione.
Solo che non riesco a farli visualizzare.
Come posso fare??
Grazie dell’aiuto…
Autore
Ciao Maurizio,
per caratteri speciali intendi quelli tipo: “§°ç” o caratteri creati da codice?
Grazie Mauro per avermi risposto.
I caratteri speciali li creo in binario (qui di seguito l’esempio di uno):
byte ON_char[8] = {
B00000,
B01110,
B10001,
B10001,
B10001,
B10001,
B01110,
B00000
};
poi in in void setup():lcd.createChar(0, ON_char);
e nel void loop() :lcd.write(byte(0));
Ne ho creati quattro di caratteri, poi li dovrei mettere su una riga del display (20caratteri), ma gli stessi all’interno dello sketch variano, essendo variabili.
Se li devo scrivere in maniera statica ok, ci risco, ma la mia idea era quella di creare un array con all’interno questi caratteri che cambiavano di stato in base a delle condizioni.
Grazie per l’aiuto.
Autore
Ciao Maurizio,
potrei non aver compreso la richiesta, provo a risponderti in funzione di quello che comprendo.
I caratteri speciali, trovi un articolo dedicato nel blog, li crei come matrici 5×8 e li assegni nel buffer dell’LCD con il metodo “createChar” poi nel tuo codice usi i valori quando ti servono come dei normali caratteri.
Grazie Mauro per la risposta, fino alla creazione del carattere c’ero arrivato, il mio problema era visualizzare una serie di variabili che cambiavano di stato (associando i caratteri speciali creati).
Credo di aver risolto creando un array di tipo char e poi andando a scrivere in ogni “slot” il carattere da visualizzare per poi mandarlo in scrittura all’LCD.
char str[21]={‘ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘};
void loop(){
codice e variabili modificabili e scrivo nell’array
}
void display():{
for(i=0;i<20;i++){
lcd.setCursor(i,3);
lcd.print(str[i]);
}
Così funziona e chiedo il tuo parere, c'è una strada migliore?
Comunque mi rimane una grande confusione con char e string….che differenza c'è tra char e char*??
Grazie.
Autore
Ciao Maurizio,
è una buona strada, la stessa che probabilmente avrei adottato se avessi avuto il medesimo problema. Tuttavia non mi sono mai posto nella condizione di giudicare una soluzione software in quanto dico che: “dato un problema sw da risolvere” penso ” esistano almeno 100 modi di risolverlo” e tutti validi.
Per la seconda domanda ti consiglio la lettura dell’argomento su un manuale C.
Grazie Mauro.
Puoi consigliarmi un buon manuale di C??
Magari in Italiano???
Grazie ancora.
Autore
Ciao Maurizio,
non saprei consigliartelo, penso che per iniziare tu possa acquistarlo on-line leggendo le recensioni di chi lo ha già letto.
Alla riga 13 manca una parentesi tonda di chiusura dopo il 5
Molto interessante l’articolo, grazie
Autore
Grazie,
errori di battitura .. correggo subito.