Convertire char in intero

Salve a tutti volevo sapere come convertire un valore char in intero. In pratica scrivo su seriale (esempio: NUMERO10) e leggo il dato che memorizzo su una variabile char ma io vorrei gestire il numero (in questo caso 10). Sul forum ho trovato una cosa simile ma viene fatta gestendo una stringa e poi viene trasformata in float.

Pos_Carattere_1 = inData.indexOf('P');
         Di_Servizio_1 = inData.substring(Pos_Carattere_1 + 1, 2 ); 
         Di_Servizio_1.toCharArray(output_1, 9); 
         Variabile_1 = atoi(output_1);
         println(Variabile_1);

Sono nelle vostre mani :slight_smile:
Grazie in anticipo!

Non è chiarissimo.
Se dici di inviare su seriale "NUMERO10" non invii su seriale 1 char che conterrà ad esempio "10" ma ben 8 char di cui gli ultimi due sono '1' e '0'. Come fai perciò a mettere in 1 variabile 2 cifre?

Se dici di voler convertire un char in numero tipo '5' -> in 5 allora basta che fai

char c='5';
int i=c-'0';          // c='5'=53   '0'=48 nella tabella ascii   53-48=5

Se però hai più di un carattere hai un vettore di caratteri o una stringa (vettore di caratteri terminato da fine stringa \0) ?
Se hai una stringa (attenzione NON un oggetto String) puoi usare semplicemente atoi()

char str[]="123";
int i=atoi(str);

Se hai un vettore di caratteri di dimensione fissa (non terminato da fine stringa) e le cifre sono sempre scritte tutte, ad esempio:
char vc1={'0','0','8'}; oppure char vc2={'1','2','3'};
puoi fare un calcolo:
int i=(vc2[0]-'0') * 100 + (vc2[1]-'0') * 10 + (vc2[2]-'0') ; // prima cifra 100+seconda10+terza
supponi di spedire via seriale il valore di un colore di un led R010 oppure G210 sempre 4 caratteri di cui 3=cifre

P.S. quel codice non converte in float, se usa atoi() fa da Ascii TO Integer; atof() invece per i float

Grazie per la risposta.
La soluzione che si avvicina di più è l’ultima però come faccio per esempio se scrivo su seriale “NUMERO10” o “NUMERO100” a eliminare il le lettere e prendere solo il numero? A me interessa gestire come da esempio solo 10 o 100.

Beh difficile da dire, dipende dalla logica del tuo programma.
Per fare quello che dico nell'ultimo esempio è importante che le cifre ci siano tutte (in quel esempio 3)
Se tu stabilisci che su seriale ricevi sempre qualcosa del genere:
NUMERO010
NUMERO123
NUMERO008

Allora nel vettore le tue 3 cifre sono dall'elemento 7 al 9. Nell'esempio mio vc2 da 0 a 2.

Se il numero invece ha lunghezze varie allora ti conviene usare la atoi(), ma prima dovrai "copiare" la parte numerica in un secondo vettore
usando la strncpy() che copia da una stringa ad un'altra per n caratteri.
Dovrai analizzare la frase ricevuta (spero almeno che NUMERO sia sempre fisso) e stabilire quante cifre hai ricevuto.

Oppure il vettore che contiene il ricevuto dovrà avere almeno un elemento in più per poter forzare un carattere '\0' alla fine.
Così potrai usare la atoi()
Esempio, ricevi NUMERO44, perciò hai ricevuto 8 caratteri (vet da 0-7)
La cella vet[8]='\0'; cosi metti il fine stringa, naturalmente vet deve avere almeno 9 celle!!!
ora int i=atoi(vet+6);
non puoi fare int i=atoi(vet); perchè gli diresti di partire dal primo elemento, ovvero N
se gli passi vet+6, allora passi alla atoi() la posizione della cella 6

Ho provato a fare così

inData[8]='\0';
         Variabile_1=atoi(inData+6);
Serial.println(Variabile_1);

ma quando stampo Variabile_1 mi dà sempre 0 come valore. Sbaglio qualcosa?

davix10:
come faccio per esempio se scrivo su seriale "NUMERO10" o "NUMERO100" a eliminare il le lettere e prendere solo il numero?

Usi la funzione isdigit() essa restituisce TRUE se il char analizzato è un numero (0-9), crei una variabile Temp dove accodi i valori trovati, terminata la lettura dei caratteri fai la conversione in intero

ciao

Grazie mille pablos!! con il tuo metodo sono riuscito :slight_smile:

Non è che ti avevo detto di mettere SEMPRE vet[8]='\0';
se ricevi 8 caratteri lo metti all'8, altrimenti devi valutare dove metterlo.

La isdigit() è utile ma se ricevi sempre all'inizio NUMERO sai che le cifre partono dalla cella 6.
Quello che devi scoprire è quante cifre ci sono. Saprai almeno quanti caratteri hai ricevuto in tutto? Basta contarli, a ogni carattere ricevuto i=i+1;
alla fine della ricezione i è posizionato alla cella in cui metti '\0'. Poi x=atoi(vet+6);