Go Down

Topic: Serial.read() mi svuota il buffer()? (Read 853 times) previous topic - next topic

legolas93

Code: [Select]
void inviaSegnale(){
  //Segnale d'Inizio trasmissioni
  arduino.write(5);
  arduino.write(ardAttuale++);
 
}


Questo è il codice su Processing. Ovviamente Arduino-Serial ecc è tutto settato correttamente. ardAttuale è una variabile che si incrementa a partire da 0.

Code: [Select]
void loop(){ 
   
  if(Serial.available()>0)
  Serial.write(Serial.read());
     
}


Questo è il codice su Arduino.


Se eseguo entrambi, la console di processing mi stampa una serie infinita di 5..Mmm..Non dovrebbe stamparmi il 5 alternato al valore della variabile?

Questo è il draw di processing:

Code: [Select]
void draw() {
 

  inviaSegnale();
  delay(10);
  ascoltaArduino();
 

 
}

void ascoltaArduino(){
  if(arduino.available()>0)
  println(arduino.readBytes()[0]);
}
     
"Sono convinto che l'informatica abbia molto in comune con la fisica...Dentro i confini del computer, sei tu il creatore. Controlli - almeno

legolas93

Ok ho fatto alcune prove. Se non ho capito male il buffer si svuota quando do un'istruzione Write. Ecco perchè non mi rilevava il secondo Byte. Mentre usando questo codice:

Processing

Code: [Select]
void draw() {
 
  /*
  if(arduino.available()>0)
  println(arduino.readBytes()[0]);
  */
  inviaSegnale();
  //delay(100);
  ascoltaArduino();
  //delay(100);
 
   
   
 
}

void ascoltaArduino(){
  if(arduino.available()>1)
  println(arduino.readBytes()[1]);
}

void inviaSegnale(){
  //Segnale d'Inizio trasmissioni
  arduino.write(5); 
  arduino.write(ardAttuale++);
 
}



Non guardate i commenti.

Arduino.

Code: [Select]

void loop(){ 


  while(Serial.available()>1)
    valori[i++] = Serial.read();

  Serial.write(valori[0]);
  delay(100);
  Serial.write(valori[1]);

  i = 0;


}


Quindi messso così dovrebbe sempre stamparmi la variabile e non il 5. Perchè se tolgo il delay da Arduino continua ad andare fuori sincronia?..Nel senso..mi stampa un po' il 5 e un po' la variabile..  :~
"Sono convinto che l'informatica abbia molto in comune con la fisica...Dentro i confini del computer, sei tu il creatore. Controlli - almeno

legolas93

Ho trovato la soluzione. Tolto tutti i delay. Torno alla versione precendente alla 1.0 dell'IDE e tutto funziona perfettamente senza perdere colpi..ho letto che nell'1 è stato implementato un nuovo meccanismo di scrittura (buffer...eccc)..e che quindi tra operazioni di input e output è necessario un delay di qualche millisecondo..

Buono a Sapersi. Qualcuno ha riscontrato la stessa cosa?. Vorra dire che svilupperò sullo 023 il mio progetto. Mi serve un tempo di risposta così veloce.
"Sono convinto che l'informatica abbia molto in comune con la fisica...Dentro i confini del computer, sei tu il creatore. Controlli - almeno

PaoloP

Nella 023 la comunicazione seriale è sincrona, nella 1.0 è asincrona ovvero avviene in "parallelo" con l'esecuzione del codice.

legolas93


Nella 023 la comunicazione seriale è sincrona, nella 1.0 è asincrona ovvero avviene in "parallelo" con l'esecuzione del codice.

Perfetto  :)
Esiste un modo per renderla sincrona anche nel nuovo IDE?
"Sono convinto che l'informatica abbia molto in comune con la fisica...Dentro i confini del computer, sei tu il creatore. Controlli - almeno

PaoloP

Forse potresti trasferire il codice riguardante la seriale dal vecchio core al nuovo core. Ma credo che non ne valga la pena.

legolas93


Forse potresti trasferire il codice riguardante la seriale dal vecchio core al nuovo core. Ma credo che non ne valga la pena.


Ok allora uso direttamente 023 e basta  :). Ma quindi è vero o no che appena utilizzo un Serial.write(..) il buffer in ingresso si svuota?
"Sono convinto che l'informatica abbia molto in comune con la fisica...Dentro i confini del computer, sei tu il creatore. Controlli - almeno

lesto

metti una Serial.flush(), e automagicamente il tuo codice aspettera fichè la seriale non ha finito di scrivere.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

legolas93

Mi sembrava strano che non ci avessero pensato  8)..eppure avevo provato già con il flush..ma probabilmente avevo sbagliato qualcosa..Ovviamente questa istruzione la devo mettere dopo ogni write vero?..

Appena ho finito di fare un po' di integrali ci provo!. Cavolo, domani ultima verifica e poi via a dividere il tempo tra Ragazza, Maturità e Arduino  :P
"Sono convinto che l'informatica abbia molto in comune con la fisica...Dentro i confini del computer, sei tu il creatore. Controlli - almeno

lesto

ovvio, dopo ogni write oppure quando nei hai bisogno, magari ogni volta a fine loop
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

PaoloP


Mi sembrava strano che non ci avessero pensato  8)..eppure avevo provato già con il flush..ma probabilmente avevo sbagliato qualcosa..Ovviamente questa istruzione la devo mettere dopo ogni write vero?..

Il flush della 023 e della 1.0 lavorano diversamente. Forse hai provato solo col l'IDE 1.0


Appena ho finito di fare un po' di integrali ci provo!. Cavolo, domani ultima verifica e poi via a dividere il tempo tra Ragazza, Maturità e Arduino  :P

Due cose le puoi tralasciare, almeno fino all'estate... e non è la maturità.  :smiley-mr-green: XD

lesto



Mi sembrava strano che non ci avessero pensato  8)..eppure avevo provato già con il flush..ma probabilmente avevo sbagliato qualcosa..Ovviamente questa istruzione la devo mettere dopo ogni write vero?..

Il flush della 023 e della 1.0 lavorano diversamente. Forse hai provato solo col l'IDE 1.0

semmai il contrario :)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

legolas93



Mi sembrava strano che non ci avessero pensato  8)..eppure avevo provato già con il flush..ma probabilmente avevo sbagliato qualcosa..Ovviamente questa istruzione la devo mettere dopo ogni write vero?..

Il flush della 023 e della 1.0 lavorano diversamente. Forse hai provato solo col l'IDE 1.0


Appena ho finito di fare un po' di integrali ci provo!. Cavolo, domani ultima verifica e poi via a dividere il tempo tra Ragazza, Maturità e Arduino  :P

Due cose le puoi tralasciare, almeno fino all'estate... e non è la maturità.  :smiley-mr-green: XD


Eh no..Arduino viene davanti alla commissione con me!  :) Poi vi farò un resoconto promesso  :P e per la ragazza negativo alla stessa maniera  :smiley-mr-green:

Mi tengo tutto ben stretto  :) Inizio le prove ora ora con la seriale!
"Sono convinto che l'informatica abbia molto in comune con la fisica...Dentro i confini del computer, sei tu il creatore. Controlli - almeno

Go Up