convertire string in int

ciao a tutti.
Vorrei convetrire una stringa in un int. Le definizioni sono queste:

//***************
#define dimVettore 5 // lunghezza max del buffer di lettura (stringa seriale)
char stringaSERIALE[dimVettore + 1]; // stringa buffer
int Passi;
//**************

devo estrarre dalla stringa P1234 il numero 1234.
un modo a cui sono ricorso è il seguente:
//**************
Passi= (((stringaSERIALE[1]-48)1000)+ ((stringaSERIALE[2]-48)100)+((stringaSERIALE[3]-48)10)+ ((stringaSERIALE[4]-48)1));
Serial.println(Passi);
//
***********

poi vedendo sul vs. forum ho appreso della funzione atoi ed ho applicato la seguente linea di codice

//***************
Passi= atoi(&stringaSERIALE[1]);
Serial.println(Passi);
/****************
entrambi i metodi sembrano restituirmi il risultato corretto, ma non mi sono chiare però alcune cose:

  1. la stringa che invio è per esempio P1234, se, come ho visto da esempi, scrivo
    Passi= atoi(stringaSERIALE[]); non mi funziona. Sono errati gli esempi oppure cosa?
  2. come fa la linea di codice "Passi= atoi(&stringaSERIALE[1])" a sapere che deve fermarsi alla fine della della lunghezza corretta, controlla il ritorno a capo?
  3. vi sono altri metodi per una conversione di questo tipo?

Ringrazio in anticipo chi mi volesse/sapesse rispondere.
Renato

Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione, poi, essendo questo il tuo primo post, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

  1. la stringa che invio è per esempio P1234, se, come ho visto da esempi, scrivo
    Passi= atoi(stringaSERIALE[]); non mi funziona. Sono errati gli esempi oppure cosa?

Intanto se vuoi passare la stringa intera, devi omettere le parentesi quadre. Se però fai così, sappi che atoi() smette di convertire al primo carattere che non è un numero, per cui trovando subito una P manco inizia, in questo caso.

  1. come fa la linea di codice "Passi= atoi(&stringaSERIALE[1])" a sapere che deve fermarsi alla fine della della lunghezza corretta, controlla il ritorno a capo?

Le stringhe in stile C, come quelle che stai usando, sono vettori (array) di caratteri. Esse contengono tanti caratteri quanti ne puoi contare a occhio nudo più uno, che contiene il carattere '\0' (codice ASCII 0), che serve appunto a dire che la stringa finisce lì. Tutte le funzioni della libreria C che processano stringhe cercano questo carattere per capire quando smettere di processare. Questo è il motivo per cui se prevedi di gestire stringhe di, ad esempio, 10 caratteri, devi prevedere un vettore di 11.

  1. vi sono altri metodi per una conversione di questo tipo?

Nota che il tuo primo metodo è estremamente specifico al tuo caso, visto che salta sempre il primo carattere e gestisce correttamente solo numeri di 4 cifre. Numeri di 2 o 3 creerebbero un gran casino :). Nota anche che, per migliorare la leggibiità, sarebbe meglio scrivere '0' invece di 48: a proposito, ti è chiaro il perché di questo 48? Ci sono altri metodi (sscanf()), ma su Arduino è generalmente una buona idea utilizzare appunto atoi() o tuttalpiù strtol(), a causa della limitatezza delle sue risorse.

Grazie mille per la risposta "SukkoPera". Mi scuso per la fretta con cui mi sono buttato nel forum senza presentarmi e senza prima aver letto il regolamento. Faccio ammenda.
Quello che hai scritto è molto chiaro.
Perchè sottraggo 48dec=0x030? è per via del valore numerico ascii dei caratteri ricevuti. '0'=0x30=48dec.
Una ulteriore domanda: perchè atoi() o strtol() per via delle risorse?
Sono davvero soddisfatto.
Renato

renatochiara:
Una ulteriore domanda: perchè atoi() o strtol() per via delle risorse?

Perché non sei su un PC, ma sei su una piccola MCU che ha solo 2 KB di SRAM e una cpu che viaggia a 16 MHz. In queste condizioni è sempre meglio utilizzare funzioni "leggere" ed ottimizzate a fare quello che serve, piuttosto che funzioni "pesanti" perché molto generiche.

Guglielmo

... del resto è lo stesso motivo per cui sconsigliamo sempre di usare la "classe" String del C++ ed invece spingiamo l'uso delle stringhe classiche del 'C', basate su array di caratteri.

Guglielmo

renatochiara:
Perchè sottraggo 48dec=0x030? è per via del valore numerico ascii dei caratteri ricevuti. '0'=0x30=48dec.

Bravo :). Ma proprio per esplicitare questa cosa è bene scrivere direttamente '0' nel codice. Metti poi mai che il tuo codice venga compilato su una macchina che non usa ASCII...

invece di scrivere "-48" si poteva benissimo fare

-'0';

che è la stessa cosa.

@vendicatoremascherato, lo so, l'ho solo ripetuto con parole più stupide.