Ho una stringa che prelevo da Bluetooth con terminatori "\n" iniziale e "\r" finale
leggo la stringa ed estraggo i dati che mi servono, 2 dati esempio:forum`
stringa che arriva \nC01\r
estraggo ed assegno una stringa "lettera" corrispondente alla lettera della stringa stessa, quindi C
estraggo ed assegno una stringa "cifra" corrispondente alla cifra della stringa stessa, quindi 01
a questo punto voglio richiamare la void letteraC assegnando i dati da passare letteraC(cifra)
siccome ho più "lettera" che mi arrivano , letteraX, letteraC , quando mi arrivano i dati mi si attivano tutte le "lettere" in coda e non solo quella richiamata
sotto il codice
Perdona, ma ... per evitare incomprensioni di linguaggio ti prego di osservare che quella che tu hai creato è una funzione che, non restituendo un valore, è di tipo void.
La parolina void identifica il fatto che la funzione non ritorna un valore al chiamante. Se la funzione avesse ritornato un valore, al posto di void avresti dovuto mettere il tipo di valore tornato (byte, int, long, ecc.).
Quindi quelle che scrivi sono funzioni e se non ritornano nulla sono di tipo void, altrimenti si deve specificare il tipo del valore che ritornano.
Si effettivamente non ho capito lo scopo della funzione, siccome ho una 30ina di dati diversi quindo dovrei semplicente dare un nome fra paentesi graffe e li mettere il codice? Grazie mille
grazie per la risposta, non mi sono spiegato:
dalla stringa estraggo correttamente il dato ma è il "trattamento" del dato che non riesco a fare
vorrei creare e quindi richiamare diverse "sub" dove mettere l'azione da fare
chiedo : è possibile?
grazie
Ora sono io che non capisco. Lo hai già fatto sopra.
A seconda della lettera, fai una serie di if e richiami la void giusta.
Se leggi la lettera come char sarebbe più semplice, essendo un numerico puio usare la switch() che è simile al select-case del vb
P.S. se posti solo pezzi di codice, difficile capire che hai scritto e dove hai fatto il casino, perchè da quel poco che scrivi, se arriva la lettera C deve stampare solo arrivata la C, a meno che hai fatto casini con le graffe delle funzioni void
Uso poco String, però...
se usi stringa.charAt(n) ottieni un intero, ovvero l'ascii della lettera, quindi puoi usare swich
readString="xxxC01xxx";
char c=readString.charAt(4); //carattere a posizione 4
switch(c)
{ case 'C': letteraC(); break;
case 'A': letteraA(); break;
...
case 'Z': letteraZ(); break;
default: // in tutti gli altri casi
}
occhio, non ricordo se String parte da 0 o 1, la uso poco. Presumo parte da 0 come le stringhe classiche del c (vettori di char)
P.S. spiega che vuoi fare, mi pare una cavolata fare 26 funzioni (void) diverse
ne basta una a cui passi un parametro (la lettera)
readString="xxxC01xxx";
char c=readString.charAt(4); //carattere a posizione 4
lettera(c);
}
...
void lettera(char p_char)
{ Serial.print("arriva lettera ");
Serial.println(p_char);
}
Rileggi il tuo primo post, c'è un pasticcio con il tag code e il codice non appare come dovrebbe apparire.
Se readString contiene 5 caratteri perché 6,7 e 7,9 al posto di 1,2 e 2,4?
Il codice sotto lavora correttamente:
void setup() {
Serial.begin(115200);
String readString("\nC01\r"); // Czerouno
String lettera = readString.substring(1,2);
String cifra = readString.substring(2,4);
Serial.println(lettera);
Serial.println(cifra);
if (lettera == "C") {
Serial.println("call C");
//letteraC(); // chiamata a funzione letteraC()
}
}
e stampa nel serial monitor quanto segue:
C
01
call C
Quindi si, è possibile chiamare una funzione in base al contenuto della variabile String lettera.
Però, dipende da quello che vuoi fare, si possono consigliare soluzione differenti per evitare di
creare 50 funzioni letteraX differenti.