Scrittura in decimale su seriale

Salve a tutti,

avrei bisogno di scrivere su seriale un valore decimale e farlo leggere ad arduino come tale.
La cosa che ho fatto molto banalmente con l’ istruzione

teta_des = Serial.read();
Serial.print("Posizione desiderata : ");
Serial.println(teta_des,DEC)

è stata quella di convertire un carattere con il corrispondente valore decimale della tabella ASCII (es.: digitando z ottengo 122), ma non mi è sufficiente.
Ciò di cui avrei bisogno è ad esempio poter scrivere 360 sulla seriale e leggerlo di conseguenza.
Come fare??
Grazie a tutti per l’aiuto!!

Scrivi una piccola routin in C per il tuo Arduino che legga i caratteri da seriale seguendo queste semplici regole:

INIZIO:
Se il carattere ricevuto è minore di '0', maggiore di '9' o non è 'CR' ignoralo e torna a INIZIO;
Se il carattere ricevuto è uguale a CR (ASCII 13) vai alla [CONVERSIONE];
altrimenti: incrementa il contatore cifre e copia la cifra ricevuta nel buffer delle cifre togliendo il valore ASCII 48 (corrispondente allo '0');
Salta a INIZIO

CONVERSIONE:
in un loop somma i valori decimali ricevuti nel buffer moltiplicando ciascuno a seconda della posizione ricevuta (migliaia, centinaia, decine, unità)

Il gioco è fatto!

Chiaramente occorrerà che prima del primo uso e dopo ogni conversione tu inizializzi il buffer (un normale array di byte) e azzeri il contatore di cifre (l'indice dell'array)

Puoi usare lo stesso metodo per ricevere anche comandi interpretando altri caratteri. Per tua comodità qui trovi una tabella dei codici ascii: http://www.asciitable.it/ascii.asp

Spero di averti dato tutti gli imput per poter scrivere il tuo codice :wink: Buon lavoro!

P.S: non so a cosa serva questa acquisizione dati, ma ricordati che se il tutto deve funzionare all'interno di un determinato programma che esegua specifiche azioni, una funzione come quella sopra descritta messa in un loop principale ti bloccherebbe inevitabilmente tutto il flusso de tuo software (un loop infinito sino a quando non riceve un CR). Per questo sarebbe necessario attivare tale routin sotto un interrupt generato dalla ricezione della seriale...

ciao

@kokiua
le cose sono piú semplici. per convertire una fila di caratteri (per intenderci i simboli dei numeri da 0 a 9) basta il seguente dove nel array l' ultimo valore deve essere un zero come termine stringa.
@alex984
"Ciò di cui avrei bisogno è ad esempio poter scrivere 360 sulla seriale e leggerlo di conseguenza.":
esempio:
int valore;
data[0]="3";
data[1]="6";
data[2]="0";
data[3]=0;

valore = atof(Data);

Ciao Uwe

@uwefed
ok per l'uso della funzione atof() che elimina il loop finale (la conversione ovvero il mio sostituto della funzione da te indicata).
Il mio è stato un "errore" dato dall'abitudine di lavorare molto in ASM, dove queste "comodità" non ci sono... (e spesso la riscrittura di routin standard finalizzate a specifici compiti accelerano di molto il flusso e consumano meno lo stack :wink: )

In merito alla mia risposta a alex984 ho cercato di immaginare l'uso che ne vuole fare, e se immaginiamo che voglia inviare nel tempo ad Arduino una serie di valori per modificare la posizione ad esempio di un servomotore, occorre trattare la ricezione dei dati in modo più completo di quanto da te descritto.

La tua soluzione, se non viene inserita in una routin di gestione idonea come quella da me accennata, funziona solo una volta, e se le cifre sono più di 3 non funziona affatto. Così come se si inserisce per errore un'altro carattere nel mezzo, torna risultati errati...

Se tu avessi sostituito la parte della conversione nel mio esempio con la funzione atof() avresti migliorato la mia risposta, così invece, affermando che "le cose sono più semplici", provochi solo più confusione, non pensi? ::slight_smile: