Come si divide una stringa in entrata?
Sto inviando una lista di posizioni del servo attraverso la connessione seriale all'arduino nel seguente formato
1:90&2:80&3:180
Che verrebbe analizzato come:
servoId : Posizione & servoId : Posizione & servoId : Posizione
.
Come potrei dividere questi valori e convertirli in un intero?
52
3
Contrariamente ad altre risposte, preferisco stare lontano da
String
per i seguenti motivi:In un ambiente embedded come Arduino (anche per un Mega che ha più SRAM), preferirei usare funzioni C standard:
strchr()
: cerca un carattere in una stringa C (cioèchar *
)strtok()
: divide una stringa C in sottostringhe, basandosi su un carattere separatoreatoi()
: converte una stringa C in un `intQuesto porterebbe al seguente esempio di codice:
Il vantaggio qui è che non ha luogo alcuna allocazione dinamica di memoria; si può anche dichiarare
input
come variabile locale all'interno di una funzione che leggerebbe i comandi e li eseguirebbe; una volta che la funzione viene restituita si recupera la dimensione occupata dainput
(nello stack).Potreste fare qualcosa come la seguente, ma tenete conto di diverse cose:
Se usate
readStringUntil()
, aspetterà finché non riceve il carattere o va in timeout. Quindi, con la tua stringa attuale, l'ultima posizione durerà un po' di più, dato che deve aspettare. Puoi aggiungere un trailing&
per evitare questo timeout. Puoi facilmente controllare questo comportamento nel tuo monitor, prova a inviare la stringa con e senza l'extra&
e vedrai questo ritardo di timeout.In realtà non hai bisogno dell'indice del servo, puoi semplicemente inviare la tua stringa di posizioni, e ottenere l'indice del servo dalla posizione del valore nella stringa, qualcosa come:
90&80&180&
. Se usi l'indice del servo, forse vuoi controllarlo (convertire inint
, e poi abbinare l'indice i del loop) per assicurarti che nulla sia andato storto con il tuo messaggio.Devi controllare che la stringa di ritorno da
readStringUntil``` non sia vuota. Se la funzione va in timeout, non hai ricevuto abbastanza dati, e quindi ogni tentativo di estrarre i tuoi valori
int``` produrrà strani risultati.Potete usare
Stream.readStringUntil(terminator)
passando un terminatore diverso per ogni parte.Su ogni parte si chiama poi
String.toInt