Go Down

Topic: Serial.read di un numero (Read 1 time) previous topic - next topic

Gono

Ciao a tutti! Rieccomi partito in quarta a fare domande  :D
Quello che volevo fare è inviare dal computer (con python) un numero da 0 a 255 per il PWM.
Il problema è che il Serial.read mi legge solo un carattere alla volta e quindi non mi funziona nulla  :(
Avete qualche idea per poter ricevere il numero tutto intero?
SO Linux - Ubuntu 12.04 - Arduino Uno R3 - IDE 1.0.5

leo72

L'argomento dell'invio di dati sulla seriale è stato affrontato un migliaio di volte  :smiley-sweat:
Onde evitare di riscrivere post su post, ti consiglio di fare una ricerca per tirar fuori le info che ti servono.

Gono

Forse sono io incapace a cercare (cosa molto probabile  :D), ma non ho trovato nulla di esaustivo.
SO Linux - Ubuntu 12.04 - Arduino Uno R3 - IDE 1.0.5

ale92

leggermente differente ma praticamente lo stesso argomento, se cerchi ci sono anche varie soluzioni
http://arduino.cc/forum/index.php/topic,119694

Gono

In linea di massima dovrebbe funzionare questo: (quello dell'ultima pagina del topic linkato da ale92)

Code: [Select]

int vet[3] = { -2, -2, -2 };  //numero arbitrario, usato per vedere se è stato inserito un numero o no (non so perchè tu abbia messo -3 in quello da tre cifre, il -2 non centra niente con la dimensione dell'array) non ho
//usato -1 perchè significa che non ci sono dati da leggere (secondo la serial available) quindi si poteva fare confusione
int cont = 0;
int x = 0;

void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);
}

void loop()
{
  while (Serial.available() > 0)
  {
    vet[cont] = Serial.read()-48;   //trasformo da codice ascii a numero utilizzabile
    cont++;
    delay(50); //sinceramente non so il motivo tecnico ma l'ho messo perchè mi si è accesa una lampadina, senza la serial available da dei "falsi negativi" cioè legge un byte, poi anche sei hai messo 2 numeri l'istruzione //dice che non c'è più niente da leggere e quindi esce dal while, forse l'esecuzione è troppo veloce per i sui gusti, non so....
  }
 
   if (vet[0] < -2 || vet[1] < -2 || vet[2] < -2 )  Serial.println("E' STATO INSERIRTO UN CARATTERE INSERIRE SOLO NUMERI DA 1 A 999  ");

   if (vet[0] > 9 || vet[1] > 9 || vet[2] > 9)  Serial.println("E' STATO INSERIRTO UN CARATTERE  INSERIRE SOLO NUMERI DA 1 A 999  ");
   


  if(cont > 0) //se ho letto qualcosa fai la conversione altrimenti niente
  {
    cont = 0;
    if (vet[1] == -2 && vet[2] == -2) //se vet[1] = a -2 cioè il valore iniziale significa che c'era solo un numero da leggere quindi è un numero da 0 a 9
    {
      x = vet[0];
    }
    else
    if ( vet[2] == -2) //se vet[1] = a -2 cioè il valore iniziale significa che c'era solo un numero da leggere quindi è un numero da 0 a 9
    {
      x = vet[0] * 10 + vet[1];
    }
    else
    {
      x = vet[0] * 100 + vet[1]* 10+ vet[2]; //altrimenti faccio la formulina perchè è un numero da 10 a 99
    }
   
         if (vet[0] < -2 || vet[1] < -2 || vet[2] < -2 ) x =0;
   if (vet[0] > 9 || vet[1] > 9 || vet[2] > 9)  x =0;
    Serial.println(x);
    vet[0] = -2;   //fix per il bug della versione precedente
    vet[1] = -2;
    vet[2] = -2;
  }
}


L'unico problema è che utilizzando una scroolbar da python per inviarli un valore, lui da difficoltà a riceverli velocemente.
SO Linux - Ubuntu 12.04 - Arduino Uno R3 - IDE 1.0.5

Go Up