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?
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));
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.
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*)'
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
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.
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
#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
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