Richiamo void come sub in vb6

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

```

readString="\nC01\r";
lettera =readString.substring(6,7);
cifra =readString.substring(7,9);

				if (lettera=="C")  letteraC();
					
				void letteraC()
				{
                                      Serial.println("arriva lettera C");
				}
				
				void letteraO()
				{
                                      Serial.println("arriva lettera O");
				}

					
nel serial motor esce
					arriva la lettera C
					arriva la lettera O

riassumendo non riesco ad "agganciare" solo e solamente la void singola

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. :slight_smile:

Guglielmo

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.

Ciao.

Sento puzza di problema XY

Comunque se usi "c" puoi solo fare tante if == con oggetti stringa

Se usi 'c' puoi fare switch case con oggetti carattere

Se togli '0' da 'c' puoi usare un array di puntatori a funzioni

Se spieghi cosa fanno le funzioni che vuoi creare magari si semplifica molto di più