Pages: [1]   Go Down
Author Topic: Convertire stringa in numero  (Read 1117 times)
0 Members and 1 Guest are viewing this topic.
Udine
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


 
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 328
Posts: 22733
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Udine
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: November 19, 2011, 09:33:24 am by pablos71 » Logged

no comment

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 328
Posts: 22733
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

Code:
#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 smiley-wink
È un po' un workaround, ma funziona smiley-wink
« Last Edit: November 19, 2011, 09:53:57 am by NeXTWay » Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ancora più facile:

atoi( stringa.toCharArray() );
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ancora più facile:

atoi( stringa.toCharArray() );

Forte, non avevo mai usato il tipo String.
È fantastico smiley-grin
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

no comment

Udine
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Risolto grazie mille a tutti.
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: