Go Down

Topic: Convertire stringa in numero (Read 1 time) previous topic - next topic

kikko_965

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="";
   }
   }



 

leo72

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);

NeXTWay

Se devi proprio, puoi usare la funzione atoi()
Code: [Select]
int valore_intero = atoi(stringa);

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*)'

pablos

#4
Nov 19, 2011, 03:23 pm Last Edit: Nov 19, 2011, 03:33 pm by pablos71 Reason: 1
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("-------------incoming atoi(thisChar)------------------- " +str2 + "  " + String(a) +"  " + D_on_off ); //debug
  //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
no comment

leo72


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.

Quote

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.

NeXTWay

#6
Nov 19, 2011, 03:51 pm Last Edit: Nov 19, 2011, 03:53 pm by NeXTWay Reason: 1

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 ;)

Code: [Select]
#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 ;)

lesto

ancora più facile:

atoi( stringa.toCharArray() );
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

NeXTWay


ancora più facile:

atoi( stringa.toCharArray() );


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

pablos

quello che ho scritto prima non è un toCharArray() ?  :smiley-eek-blue:
no comment

kikko_965

Risolto grazie mille a tutti.

lesto


quello che ho scritto prima non è un toCharArray() ?  :smiley-eek-blue:


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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up