Serial.read() mi svuota il buffer()?

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.

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:

void draw() {
  
 
  inviaSegnale();
  delay(10);
  ascoltaArduino();
  

  
}

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

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

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.

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.. :~

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.

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

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

Perfetto :slight_smile:
Esiste un modo per renderla sincrona anche nel nuovo IDE?

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

PaoloP:
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?

metti una Serial.flush(), e automagicamente il tuo codice aspettera fichè la seriale non ha finito di scrivere.

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 :stuck_out_tongue:

ovvio, dopo ogni write oppure quando nei hai bisogno, magari ogni volta a fine loop

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

legolas93:
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 :stuck_out_tongue:

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

PaoloP:

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

semmai il contrario :slight_smile:

PaoloP:

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

legolas93:
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 :stuck_out_tongue:

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

Eh no..Arduino viene davanti alla commissione con me! :slight_smile: Poi vi farò un resoconto promesso :stuck_out_tongue: e per la ragazza negativo alla stessa maniera :grin:

Mi tengo tutto ben stretto :slight_smile: Inizio le prove ora ora con la seriale!