# Convertire stringa in numero

**URL:** <https://forum.arduino.cc/t/convertire-stringa-in-numero/78588>\
**Category:** Generale\
**Created:** [November 18, 2011, 9:17pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588 "2011-11-18T21:17:59Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [November 18, 2011, 9:17pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/1 "2011-11-18T21:17:59Z")

</div>

Ciao

ho scritto questo codice, ma ho il seguente problema:

non sò come converire il valore contenuto nella stringa in un numero.

lo scopo del codice è leggere da seriale una stringa e accendere o spegnere un led  
ad esempio se invio da pc la stringa dd041 accendo il led, se invio dd040 lo spengo

scompongo la stringa dd041 in dd 04 1, prevedo 2 cifre per usare le uscite di arduino mega

il problema è che la funzione digital.Write accetta solo i valori numerici.

Non sò se mi sono spiegato.....  
Qualche suggerimento?

// leggo seriale e accendo il relativo led

String readString;  
String tipo;  
String outputpin;  
String stato;

void setup() {

Serial.begin(9600);

}

void loop() {

pinMode(4, OUTPUT);

while (Serial.available()) {  
delay(10);  
if (Serial.available() \>0) {  
char c = Serial.read();  
readString += c;}  
}

if (readString.length() \>0) {  
// Serial.println(readString);  
tipo = (readString.substring(0,2));  
outputpin = (readString.substring(2,4));  
stato = (readString.substring(4,5));

Serial.println(tipo);  
Serial.println(outputpin);  
Serial.println(stato);

if (tipo == "dd" && stato == "0"){  
digitalWrite(int('outputpin'), LOW);

Serial.println("Spengo Led...");  
}  
else if (tipo == "dd" && stato== "1"){  
digitalWrite(int('outputpin'), HIGH);

Serial.println("Accendo Led...");

}

readString="";  
}  
}

---

<div class="post-metadata">

**Author:** ![leo72](https://avatars.discourse-cdn.com/v4/letter/l/71c47a/32.png) [@leo72](https://forum.arduino.cc/u/leo72)\
**Post date:** [November 18, 2011, 10:16pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/2 "2011-11-18T22:16:32Z")

</div>

Invece di scomporre la stringa "04" in "0" e "4" e poi ricomporla lato arduino, spedisci semplicemente il byte 4 (non dico il numero "4", che sarebbe un carattere ASCII di valore 52) ma proprio una variabile byte contente il valore 4.  
Lato arduino ricevi quel byte e senza fare tanti arzigogoli lo dai in pasto direttamente a digitalWrite.

digitalWrite(PIN, VALORE);

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [November 19, 2011, 11:48am UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/3 "2011-11-19T11:48:39Z")

</div>

Se devi proprio, puoi usare la funzione atoi()

```cpp
int valore_intero = atoi(stringa);

```

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [November 19, 2011, 1:45pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/4 "2011-11-19T13:45:50Z")

</div>

Scusate, non capisco.....

l'esempio del 04 era solo per la prova, in realtà userò le uscite dal 20 al 40 di arduino mega quindi mi servono 2 cifre....

ho provato al funzione atoi ma al momento della verifica mi restituisce l'errore  
error: cannot convert 'String' to 'const char\*' for argument '1' to 'int atoi(const char\*)'

---

<div class="post-metadata">

**Author:** ![pablos71](https://avatars.discourse-cdn.com/v4/letter/p/ea666f/32.png) [@pablos71](https://forum.arduino.cc/u/pablos71)\
**Post date:** [November 19, 2011, 2:23pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/5 "2011-11-19T14:23:43Z")

</div>

fai la stessa cosa che ho fatto io  
risolta così:

dove  
String str2=140; //1 sta per ON .... la porta 40  
String str2=040; //0 sta per OFF .... la porta 40

void commutaz\_dig\_port()  
{  
String Dport = str2.substring(1,3) + "0"; // trovo il numero della porta Digit .... es: prendo il 40 dalla stringa 140  
char thisChar[Dport.length()];  
Dport.toCharArray(thisChar, Dport.length()) ;  
a = atoi(thisChar); //trovo l'intero della stringa  
String D\_on\_off = str2.substring(0,1); // prendo il primo numero che sarà 0 nel caso di 040 o 1 nel caso di 140

[//Serial.println](https://Serial.println)("-------------incoming atoi(thisChar)------------------- " +str2 + " " + String(a) +" " + D\_on\_off ); //debug  
[//Serial.println](https://Serial.println)("---------------incoming atoi(thisChar)--------------- " + D\_on\_off + " " + String(a) +" " + Dport); //debug

if(D\_on\_off == "0")  
{  
digitalWrite(a,0);  
}  
if(D\_on\_off == "1")  
{  
digitalWrite(a,1);  
}

}

puoi usare anche un solo if(D\_on\_off ==  
mettendo digitalWrite(a,D\_on\_off);

.... io avevo bisogno di separarle perchè ho altre istruzioni dentro gli if

ciao

---

<div class="post-metadata">

**Author:** ![leo72](https://avatars.discourse-cdn.com/v4/letter/l/71c47a/32.png) [@leo72](https://forum.arduino.cc/u/leo72)\
**Post date:** [November 19, 2011, 2:34pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/6 "2011-11-19T14:34:10Z")

</div>

> kikko\_965:  
> Scusate, non capisco.....
> 
> l'esempio del 04 era solo per la prova, in realtà userò le uscite dal 20 al 40 di arduino mega quindi mi servono 2 cifre....

Un byte può andare da 0 a 255.

> ho provato al funzione atoi ma al momento della verifica mi restituisce l'errore  
> error: cannot convert 'String' to 'const char\*' for argument '1' to 'int atoi(const char\*)'

Dipende da che tipo di dati gli hai passato. Atoi accetta char\*, non String.

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [November 19, 2011, 2:51pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/7 "2011-11-19T14:51:55Z")

</div>

> kikko\_965:  
> Scusate, non capisco.....
> 
> l'esempio del 04 era solo per la prova, in realtà userò le uscite dal 20 al 40 di arduino mega quindi mi servono 2 cifre....
> 
> ho provato al funzione atoi ma al momento della verifica mi restituisce l'errore  
> error: cannot convert 'String' to 'const char\*' for argument '1' to 'int atoi(const char\*)'

Ops: hai dichiarato le stringhe come String, non come array di caratteri...  
Immagino tu voglia usare String perché così hai a disposizione 'substring'

Ti ho scritto una funzione che ti fa la stessa cosa con un array di caratteri, così puoi chiamare atoi 😉

```arduino
#include <stdio.h>
#include <stdlib.h>
char *output;

char *splitString(char start, char stop, char* string)
{
 char *output = (char *) malloc(stop-start+1);
 char a = 0;
 char i;
 for (i = start; i <= stop; i++)
 {
  output[a++] = string[i];
 }
 return output;
}

int main()
{
  char *string = "123";
  int intero = atoi(splitString(0,3, string));
  printf("%d", intero);
}

```

Dichiari fuori da qualsiasi funzione la stringa output.  
Poi incolli la funzione splitString all'inizio del listato (subito dopo le variabili globali).  
Infine la richiami: prende tre valori (da dove iniziare, dove finire, la stringa su cui operare) e restituisce una stringa con cui puoi fare quello che ti pare 😉  
È un po' un workaround, ma funziona 😉

---

<div class="post-metadata">

**Author:** ![lestofante](https://avatars.discourse-cdn.com/v4/letter/l/3d9bf3/32.png) [@lestofante](https://forum.arduino.cc/u/lestofante)\
**Post date:** [November 19, 2011, 3:14pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/8 "2011-11-19T15:14:48Z")

</div>

ancora più facile:

atoi( stringa.toCharArray() );

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [November 19, 2011, 3:18pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/9 "2011-11-19T15:18:28Z")

</div>

> lesto:  
> ancora più facile:
> 
> atoi( stringa.toCharArray() );

Forte, non avevo mai usato il tipo String.  
È fantastico 😃

---

<div class="post-metadata">

**Author:** ![pablos71](https://avatars.discourse-cdn.com/v4/letter/p/ea666f/32.png) [@pablos71](https://forum.arduino.cc/u/pablos71)\
**Post date:** [November 19, 2011, 3:58pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/10 "2011-11-19T15:58:30Z")

</div>

quello che ho scritto prima non è un toCharArray() ? 😨

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [November 19, 2011, 4:03pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/11 "2011-11-19T16:03:57Z")

</div>

Risolto grazie mille a tutti.

---

<div class="post-metadata">

**Author:** ![lestofante](https://avatars.discourse-cdn.com/v4/letter/l/3d9bf3/32.png) [@lestofante](https://forum.arduino.cc/u/lestofante)\
**Post date:** [November 19, 2011, 5:25pm UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/12 "2011-11-19T17:25:23Z")

</div>

> pablos71:  
> quello che ho scritto prima non è un toCharArray() ? 😨

woops i pezzi di codice di più di una riga li ho saltati a piè pari pensando faceste la conversione "manuale", mi sono accorto ora che era il codice originale riadattato

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [May 7, 2021, 2:32am UTC](https://forum.arduino.cc/t/convertire-stringa-in-numero/78588/13 "2021-05-07T02:32:18Z")

</div>


