Pagina 1 di 3

Problema codice while(Serial.available() >=2){}

MessaggioInviato: 27 feb 2026, 16:08
da alien75
Ho il seguente codice in arduinodue:
Codice: Seleziona tutto
while(Serial.available() >=2){
        // Legge 2 byte dalla seriale
        digitalWrite(31, HIGH);
        byte byte1 = Serial.read();
        byte byte2 = Serial.read();
        value = (byte2 << 8) | byte1;
        buffer[i] = value;
        i++;
  }


Lato PC ho un'interfaccia grafica in python che invia dei valori unsigned int lungo la USB, premendo un pulsante.
La GUI è testata e funziona ma succede che lato arduino mettendo una digitalWrite() come sopra (per controllare con un tester se il while() viene eseguto), mi succede che l'uscita specifica rimane a 0. Ciò significa che non vengono recepiti i valori dal While() di arduino
e non capisco perché.
Tale codice mi è stato fornito in passato da un utente del forum.
Lo scopo è passare le posizioni degli slader di una GUI in python ad arduinodue, ma ciò non
avviene a causa dlel while() che non funziona.
Aiutatemi per favore a capire che succede.

Re: Problema codice while(Serial.available() >=2){}

MessaggioInviato: 27 feb 2026, 16:45
da boiler
Modifica come segue e verifica che il pin passi effettivamente a 1:
Codice: Seleziona tutto
while(1){
        // Legge 2 byte dalla seriale
        digitalWrite(31, HIGH);
        byte byte1 = Serial.read();
        byte byte2 = Serial.read();
        value = (byte2 << 8) | byte1;
        buffer[i] = value;
        i++;
  }


Questo esclude possibili errori che non hanno nulla a che vedere con il loop.

Re: Problema codice while(Serial.available() >=2){}

MessaggioInviato: 27 feb 2026, 20:08
da alien75
Si passa effettivamente a 1.
Il problema secondo me è la Serial.available() >=2.

Re: Problema codice while(Serial.available() >=2){}

MessaggioInviato: 27 feb 2026, 22:13
da boiler
Allora modificalo in
Codice: Seleziona tutto
Serial.available() >0

e vedi se arriva qualcosa.

Re: Problema codice while(Serial.available() >=2){}

MessaggioInviato: 28 feb 2026, 6:19
da alien75
Niente! Il pin 31 non si accende.
Codice: Seleziona tutto
Serial.available() >0


SE metto...
Codice: Seleziona tutto
Serial.available() !=0


si accende solo nell'istante in cui invia i caratteri poi torna a 0 e pure per poco tempo.

Re: Problema codice while(Serial.available() >=2){}

MessaggioInviato: 28 feb 2026, 9:34
da boiler
Le due condizioni che descrivi sarebbero equivalenti, se il valore ritornato fosse unsigned.
Però non lo è, è int. Ciononostante la documentazione non descrive casi in cui potrebbe essere negativo:
https://docs.arduino.cc/language-refere ... Available/

Non uso Arduino (e quando leggo documentazione del genere mi sento confermato nella mia scelta), si può debuggare mettendo un breakpoint?

Se sì, modifica il codice come segue:
Codice: Seleziona tutto
int av = Serial.available()
while(av !=0)

e metti un breakpoint sulla seconda riga.

Prima di tutto verifica che il breakpoint venga raggiunto ogni volta che tu ti aspetti che succeda.
E poi leggi via debugger il contenuto di av.

Re: Problema codice while(Serial.available() >=2){}

MessaggioInviato: 28 feb 2026, 9:49
da alien75
boiler ha scritto:Le due condizioni che descrivi sarebbero equivalenti, se il valore ritornato fosse unsigned.
Però non lo è, è int. Ciononostante la documentazione non descrive casi in cui potrebbe essere negativo:
https://docs.arduino.cc/language-refere ... Available/

Non uso Arduino (e quando leggo documentazione del genere mi sento confermato nella mia scelta), si può debuggare mettendo un breakpoint?

Se sì, modifica il codice come segue:
Codice: Seleziona tutto
int av = Serial.available()
while(av !=0)

e metti un breakpoint sulla seconda riga.

Prima di tutto verifica che il breakpoint venga raggiunto ogni volta che tu ti aspetti che succeda.
E poi leggi via debugger il contenuto di av.


Arduino non ha un debug degno di quel nome: si puo' usare il monitor seriale.
Ho fatto così:
Codice: Seleziona tutto
av = Serial.available();
  while(av !=0)
  { 
    Serial.println(av);
      while(1){};
        // Legge 2 byte dalla seriale
        digitalWrite(31, HIGH);
        byte byte1 = Serial.read();
        byte byte2 = Serial.read();
        value = (byte2 << 8) | byte1;
        buffer[i] = value;
        i++;
  }


... ma mi succede che il monitor seriale non scrive nessun valore sotto win10.

Re: Problema codice while(Serial.available() >=2){}

MessaggioInviato: 28 feb 2026, 9:55
da boiler
Perché devi spostare la linea con println al di fuori del while loop.
Inoltre perché adesso c'è un secondo while all'interno del primo?

Re: Problema codice while(Serial.available() >=2){}

MessaggioInviato: 28 feb 2026, 9:58
da alien75
boiler ha scritto:Perché devi spostare la linea con println al di fuori del while loop.
Inoltre perché adesso che un secondo while all'interno del primo?

Non è possibile fare breakpoint in arduino come intendi tu col debuger, quindi mi devo inventare una cosa con while(1){}.

Re: Problema codice while(Serial.available() >=2){}

MessaggioInviato: 28 feb 2026, 10:00
da boiler
Ah, capisco, vuoi fermare l'esecuzione lì.
Però devi spostare comunque la linea che scrive sulla seriale prima del while, altrimenti non vediamo nulla. Ci interessa capire perché non entri nel while, e se non ci entri, non vedremo mai il contenuto di av.