Arduino Due - SerialUSB e Serial

Salve a tutti.
Allego uno sketch a titolo di esempio, prima di fare la mia domanda:

#include <Bounce2.h>

const int myLed = 24;   // pin led
const int myButton = 28;  // pin pulsante
bool functionOnOff=1; // On/Off
unsigned long debounceDelay = 10;   // debounce
Bounce myButtonBounce = Bounce();

void setup ()
{
 
  Serial.begin(9600);
  SerialUSB.begin(9600);
  pinMode(myLed, OUTPUT);
  pinMode(myButton, INPUT_PULLUP);
  myButtonBounce.attach(myButton);
  myButtonBounce.interval(debounceDelay);
}

void loop ()
{

 myButtonBounce.update();  
 if (myButtonBounce.fell())
  {
   myFunction ();
  }
}

void myFunction ()
{
  digitalWrite(myLed, HIGH);

  while (functionOnOff)
  {
    Serial.println("SONO NEL WHILE");
    SerialUSB.println("SONO NEL WHILE");

    myButtonBounce.update();
    if (myButtonBounce.fell()) {
      functionOnOff = !functionOnOff;    
    }
  }

  digitalWrite(myLed, LOW);

}

Sketch caricato in Arduino Due.
Come vedete nel while ho riportato due print di controllo. Il problema è questo: usando la Serial per effettuare la Serial.println, una volta premuto il pulsante di uscita dal while, in effetti sul Serial Monitor (come è giusto che sia) smette di scrivere "SONO NEL WHILE" e ritorna normalmente al loop. E fin qui tutto ok. Se invece per la verifica uso la SerialUSB.println, entro nel while, a Serial Monitor compare come atteso "SONO NEL WHILE", ma quando premo il pulsante di uscita la SerialUSB continuerà a scrivere ciclicamente nel monitor seriale "SONO NEL WHILE", come se non fosse mai uscito. Tenete presente che comunque i led di spegnimento mi confermano che il ciclo while è stato interrotto. Ma allora perché la SerialUSB continua a ricevere il comando di print?
Ripeto, a livello di codice non mi blocca, però vorrei comprendere la logica della SerialUSB, che sembra andare per conto suo...
Grazie,
saluti a tutti.

Suppongo che tu ottenga molti più dati nel buffer tramite SerialUSB (che è più veloce) che tramite Serial e quindi ciò che vedi potrebbe provenire dal buffer e i messaggi dovrebbero smettere di arrivare dopo un po' di tempo.

potresti provare questo codice e condividere ciò che vedi nell'output?

#include <Bounce2.h>
const byte myLed = 24;              // pin led
const byte myButton = 28;           // pin pulsante
bool functionOnOff = true;          // On/Off
unsigned long debounceDelay = 10;   // debounce
Bounce myButtonBounce = Bounce();

void setup() {
  Serial.begin(9600);
  SerialUSB.begin(9600);
  pinMode(myLed, OUTPUT);
  pinMode(myButton, INPUT_PULLUP);
  myButtonBounce.attach(myButton);
  myButtonBounce.interval(debounceDelay);
}

void loop() {
  myButtonBounce.update();
  if (myButtonBounce.fell())myFunction ();
}

void myFunction() {
  unsigned long n = 0;
  digitalWrite(myLed, HIGH);

  while (functionOnOff) {
    Serial.print(n); Serial.println(" Serial NEL WHILE");
    SerialUSB.print(n); SerialUSB.println("SerialUSB NEL WHILE");
    myButtonBounce.update();
    if (myButtonBounce.fell()) functionOnOff = !functionOnOff;
  }

  digitalWrite(myLed, LOW);
}

Grazie J-M-L per la risposta.
Facendo il copia e incolla del tuo sketch, ho compreso il problema. Che non dipende dal codice.
Anzitutto, come mi hai chiesto, e per completezza, riporto l'output della seriale in base al tuo listato.

Con attiva SerialUSB:
"0SerialUSB NEL WHILE"

Con attiva Serial:
"0 Serial NEL WHILE"

Ti confermo che esce perfettamente dal while, tutto nella norma, e non stampa più niente.
Il problema qual era? Dovendo lavorare in parallelo con un Mega e un Due, stavo usando proprio per il Due lo sperimentale Arduino IDE 2.0 Beta 9, per comodità e perché obiettivamente è molto performante, mentre per il Mega continuavo ad usare il classico IDE.
Usano l'IDE beta, lasciando entrambe le seguenti righe attive:


    Serial.print(n); Serial.println(" Serial NEL WHILE");
    SerialUSB.print(n); SerialUSB.println("SerialUSB NEL WHILE");
    

e impostando da IDE la SerialUSB, tutto ok, l'output del monitor seriale smette di scrivere
"0SerialUSB NEL WHILE" appena premo il pulsante di uscita.

Commentando la prima riga, e lasciando attiva solo la seconda:


    // Serial.print(n); Serial.println(" Serial NEL WHILE");
    SerialUSB.print(n); SerialUSB.println("SerialUSB NEL WHILE");
    

con SerialUSB attiva da IDE, apparentemente non si esce dal ciclo While. Stamperà perennemente su monitor seriale (non si ferma mai, nemmeno aspettando all'infinito) il temuto "0SerialUSB NEL WHILE".

Direi che a questo punto si può parlare di un intoppo nell'IDE Beta, ma attenderei una tua conferma o quella di un altro più esperto di me. Confermo che con il classico IDE tutto fila liscio.

Grazie J-M-L,
saluti.

Va Bene. Ci sono molti bug nell'IDE 2.0 per quanto riguarda il monitor seriale.

https://forum.arduino.cc/search?q=Serial%20category%3A93

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.