nid69ita:
void leggi(){ //legge 3 caratteri numerici ASCII sulla seriale, li converte a integer
delay(50); ////<------------------questo delay è indispensabile!!
if (Serial.available())
{ a = Serial.read()-48; //viene sottratto 48 per rientrare nel range dei caratteri numerici ASCII (0=49,1=50....9=58)
b = Serial.read()-48; //senza un sistema di check errore, se il sistema ricevesse una "a" per esempio,
c = Serial.read()-48; //verrebbe calcolato come "65"... x1000 o x100 o x10 o x1, quindi errato.
d = Serial.read()-48;
Il pezzo di codice che hai postato non è male ed eviterebbe la atoi. Ma secondo me ha un problema di base, da per scontato che arrivino sempre 4 cifre.
Quel pezzo di codice legge il carattere numerico, esempio '2' che equivale a 48='0';49='1';50='2' perciò 50; 50-48->2
Un metodo matematico semplice per convertire '2' (ovvero 50) in 2 come cifra.
spero di averti spiegato i pezzi di codici che hai postato.
Si, effettivamente fatto così, devo per forza struturare i dati in modo che sappia sempre il numero di dati in arrivo, in realtà l'avevo creato per provare a creare un mio protocollo di comunicazione tra pc e arduino, come base funziona abbastanza bene, visto che i dati sono organizzati in base al carattere "comando" che arriva per primo, i dati numerici che arrivano in seguito devono avere il formato stabilito (ma del resto i protocolli come funzionano? se prendiamo il CAN per esempio, ha una struttura ben definita da standard, i singoli sviluppatori decidono in che ordine e con che metodo organizzare i dati trasmessi, ad esempio, giri motore, MAP, TPS, TempMotore ecc)
io ho tentato di crearmi un mio "protocollo" consapevole che è ben lontano dall'essere perfetto e a prova di errori, ma essendo che sto imparando, e per ora, i risultati ottenuti sono buoni, ho ridotto ad un minimo il numero di function predisposte alla ricezzione dei dati in arrivo, per esempio, ci sono comandi che implicano la ricezzione di 8 numeri composti da 3 cifre, quindi viene chiamata due volte la routine che "legge" le prime 4 cifre in modo da creare 8 numeri, spiegarlo a parole è difficile ma credo abbia reso l'idea. Con questo metodo, riesco a programmare una serie di array diverse costituite da 1, 2, 4, 8 numeri a 3 cifre tutto in un unico "colpo", del tipo: a100200300400b120130140150160c001002003004... l'idea è questi dati siano inviati da un programma su pc dove questi comandi siano ben stabiliti con i dati da trasmettere, ovviamente trasmettiamo stringhe troppo lunghe, prima o poi avvengono degli errori, ma ho notato che immettendo un delay di 50ms il problema non si presenta con un'invio di oltre 40 byte, ovviamente, l'idea è di non superare una soglia considerata affidabile, per esempio, le linee CAN possono avere diverse lunghezze in base alla specifica versione fino a 29 bytes (la 2.0B se non ricordo male). Come detto, so che esistoni metodi migliori, ma io sto agli inizi, e mi baso più sulla pratica che sulla teoria, per ora questa è ancora piena di lacune, sto provvedendo, ma sono lento ad imparare, purtroppo oltre ad altri problemini il tempo a disposizione è pochino.
in giro trovo tantissimi esempi di protocolli seriali per comandare a distanza arduino, ma anche li, esperti e meno esperti, ogn'uno ci mette del suo, non è che abbia trovato un' unica strada per farlo, alcuni sono semplici come il mio (l'ho imparato da un esempio) ed altri dove serve indubbiamente tanta esperienza di C per capirci qualcosa, per ora, non è il mio caso...
Ciao e grazie per le critiche costruttive!