spezzare una frase

buona sera a tutti,
mi sono presentato nell'apposito topic e vorrei riproporre la domanda che avevo erroneamente fatto poco fa nella sezione in inglese.
è possibile fare un programma che divida una frase qualsiasi (lunghezza indefinita) in tutti i suoi componenti, compresi gli spazi e l'eventuale punteggiatura? e se fosse possibile potreste darmi una mano a realizzare questa parte di programma?
(la frase viene inviata ad arduino tramite un'app via bluetooth e poi dovrebbe essere appunto separata nei singoli componenti)
grazie mille in anticipo!

Una frase dovrebbe essere inviata già "separata nei singoli componenti", poi un programma di Arduino dovrebbe riunirli nella frase. Non basterebbe, quindi, non riunirli e trattarli un elemento alla volta?

Poi dei singoli componenti cosa ne fai?
Li salvi, li stampi separatamente, li conti?

Premetto subito che NON voglio neppure prendere in considerazione String ma solo le stringhe classiche del C (quindi array/vettori di char terminati da null) !

Come detto sopra, se ricevi usando la read() che legge un byte alla volta, devi tu sapere se quel byte è un "separatore", se lo è, sai già dove è finita la frase precedente.

Comunque se hai già la frase in una stringa (NON String) allora esiste la funzione strtok (anche per le MCU avr) che permette di spezzare una frase in base a dei token. Non è semplicissima da usare.

char str[] = "this, is the string - I want to parse";
char delim[] = " ,-";
char* token;
for (token = strtok(str, delim); token; token = strtok(NULL, delim))
{  Serial.println(token);
}

Standardoil:
Poi dei singoli componenti cosa ne fai?
Li salvi, li stampi separatamente, li conti?

Scusate se non ho più risposto ma sono stato impegnato con lo studio.. A questi componenti della frase io dovrò poi associare un mini programma in modo da fa muovere dei servomotori.
In realtà anche come connettermi con il bluetooth non mi è chiarissimo, ho trovato online programmi da usare con HC-05 ma non danno i risultati sperati.
C'è per caso tra gli esempi un programma per la connessione bluetooth?

nid69ita:
Premetto subito che NON voglio neppure prendere in considerazione String ma solo le stringhe classiche del C (quindi array/vettori di char terminati da null) !

Come detto sopra, se ricevi usando la read() che legge un byte alla volta, devi tu sapere se quel byte è un "separatore", se lo è, sai già dove è finita la frase precedente.

Comunque se hai già la frase in una stringa (NON String) allora esiste la funzione strtok (anche per le MCU avr) che permette di spezzare una frase in base a dei token. Non è semplicissima da usare.

char str[] = "this, is the string - I want to parse";

char delim[] = " ,-";
char* token;
for (token = strtok(str, delim); token; token = strtok(NULL, delim))
{  Serial.println(token);
}

Ehm.. di questo ho capito davvero poco, scusate ma sono davvero alle primissime armi

eccerto che hai capito poco
dalla tua domanda sembrava che tu volessi fare trattamento testo, contare caratteri, parole, riconoscere punteggiatura e cose così
invece vuoi solo riconoscere qualche carattere per tele-comandare arduino dal telefono
prima legge di Nelson (che sono io) sulle domande:
La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

ok, ho capito che devo spiegarmi meglio quindi spiegherò tutto per filo e per segno cosa devo fare.
come progetto per la maturità io e il mio compare abbiamo creato due braccia robotiche che sono attaccate su un manichino e si devono muovere (le braccia sono composte ognuna da 5 servi e 5 staffe). cosa devono fare queste braccia? scrivere su una tastiera del pc. io ho creato un app con app inventor 2 che permette di scrivere un testo e inviarlo tramite bluetooth l modulo hc-05 che ho. fatto ciò arduino deve scomporre la frase di lunghezza indefinita che arriverà in tutti i suoi componenti e farne (avevo pensato io ma ditemi se è sconveniente o sbagliato) un array. ad ogni lettera sarà abbinato un mini programma con gli angoli che devono avere i servi per digitarla sulla tastiera. è un programma complicato e per questo chiedo aiuto a voi, potreste darmi una mano? anche facendo il programma a pezzi, non tutto assieme, e facendomi capire quello che devo fare.
grazie mille a tutti.

primo, complimenti, sembra bel lavoro
poi, NON partire da un array di lunghezza arbitraria, non te la cavi, secondo me
tratta il testo mano a mano che arriva, byte a byte
se invece devi necessariamente trattare un intero testo, che non sarà tanto lungo, causa limitazioni di ram, crea un array e leggilo circolarmente, un puntatore dice dove va il carattere appena arrivato dalla seriale, un puntatore dice quale posizione deve essere mandata in esecuzione
quando il primo raggiunge il secondo devi fermare il flusso di dati, quando il secondo raggiunge il primo hai finito il lavoro
prevedi fin da subito un protocollo, un handshaking, dato che sei su BT credo che tu debba pensare a una cosa tipo Xon Xoff

gabrybula:
arduino deve scomporre la frase di lunghezza indefinita che arriverà in tutti i suoi componenti e farne (avevo pensato io ma ditemi se è sconveniente o sbagliato) un array.

Ma scusa, perché accumulare caratteri in una stringa per poi ri-separarli (visto che necessariamente le braccia robotiche digiteranno un carattere per volta)? Ad ogni carattere ricevuto agisci di conseguenza. è tutto più semplice, al massimo puoi accumulare i caratteri se per caso dovessero arrivarne troppi tutti insieme (eviti un buffer overflow della seriale) ma comunque vanno processati singolarmente come singoli caratteri da digitare, non vedo cosa c'entri dividerli in frasi, parole, o segni. Muoverai sempre un dito alla volta (al limite due se devi gestire le maiuscole ed i segni sui tasti numerici ad esempio).

Per l'interno del programma ovviamente vedrai tu, in base al carattere da premere, ma per curiosità: non so quante dita abbiano le mani, tu parli di 5 servi quindi immagino siano 5, ma le mani sono già posizionate sulla tastiera (es. nella posizione standard indice sinistro sulla "F" e destro sulla "J") quindi devi muovere il singolo dito sui tasti di sua "competenza" (es. l'indice della sinistra gestisce i caratteri RTFGCV)? Oppure ogni mano in realtà ha un solo dito, quindi i 5 servi controllano le articolazioni ed il dito?