Leggere da seriale valore intero

Se con arduino leggo dalla seriale con Serial.read() e dal pc invio una valore intero composto da 2 cifre, arduino invece che leggere un solo valore ne legge 2.

In questo topic alla terza risposta c'è una soluzione: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191880368

Devo fare per forza così?
C'è qualche modo migliore?

C'é un metodo simile ma piú elegante dove aspetta un certo tempo e poich converte.
Quello suggerito vuole sempre il numero di byte fissi.
Ciao Uwe

ho trovato anche un'altra soluzione: leggo i valori 1 ad 1, li moltiplico per la potenza del 10 a seconda se sono decine, centinaia.. e man mano sommo il valore ottenuto ad una variabile.
è un buon metodo?

come faccio a controllare se il valore che arriva è una cifra compresa tra 1 e 9?

uwefed:
C'é un metodo simile ma piú elegante dove aspetta un certo tempo e poich converte.
Quello suggerito vuole sempre il numero di byte fissi.
Ciao Uwe

non ho capito come funziona...
aspetta cosa?

un certo tempo. Stasera ti spedisco il codice.
Ciao Uwe

Ok, grazie mille :slight_smile:

p.s. hai visto la mia risposta sopra? (ne ho messe 2)

Una versione modificata del codice che hai riportato come prima risposta potrebbe essere: anzichè imporre un limite di dimensione massima alla variabile tmp, far controllare l'ultimo byte inserito e continuare ad attendersi altre cifre fino a quando non viene inserito il carattere "return". (si utilizza la codifica ascii)
E' un'idea, non ho codici a portata di mano, ma dovrebbe funzionare...

int incomingByte;   
char Data[8];
int i;
unsigned long Tempo;

void setup()
{
  Serial.begin(9600);
}

void loop(){
 
   do {
     if (Serial.available()) {       
       Data[i] = Serial.read();
       i++;
       }     
     if(i<1)Tempo = millis(); 
     } while (i<5&&(millis()-Tempo) < 500);
  
   Data[i] = 0;    
   incomingByte = atoi(Data);  
   i=0;
   Serial.println(incomingByte);
}

Questo codice prende 5 caratteri dalla seriale oppure anche di meno se non arrivano entro 0,5 secondi e li converte in un int. I numeri possono andare da ca 32000 a ca -32000 (limite variabili del tipo int, visto che lavora con 16 bit.)
Se trasmetti per esempio solo 3 caratteri come 123 lo sketch te li prende e non aspetta finche hai mandato i restanti 2.
Se trasmetti piú di 5 cartteri li vede come 2 trasmissioni di cui la prima é lunga 5 caratteri e la seconda il restante .

Ciao Uwe

Grazie :wink:

Ma c'è bisogno di controllare il tempo?

Se invio alla seriale qualcosa e subito dopo qualcos'altro, arduino potrebbe "confondersi"?

E se invece che guardare la lunghezza di Serial.available() mettessi un carattere per indicare la fine del messaggio alla fine della stringa che invio e usassi quello per vedere dove finisce?

Il protocollo di trasmissione lo stabilisci tu, è ovvio.
Uwe ti ha messo solo un esempio, poi lo rielabori/modifichi come ti pare.

Il mio esempio é pensato per rasmetere valori che un sogetto umano inserisce nel terminale, percui senza zeri all'inizio e senza carattere di termine. Nel mio esempio puoi scrivre 1 come 32000 e ti arriva il valore senza dover scrivere 00001.
Ciao Uwe