Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

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

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

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

Messaggioda Foto Utentealien75 » 27 feb 2026, 16:08

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.
Avatar utente
Foto Utentealien75
1 1 4 7
Sostenitore
Sostenitore
 
Messaggi: 597
Iscritto il: 31 lug 2011, 14:08

0
voti

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

Messaggioda Foto Utenteboiler » 27 feb 2026, 16:45

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.
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

0
voti

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

Messaggioda Foto Utentealien75 » 27 feb 2026, 20:08

Si passa effettivamente a 1.
Il problema secondo me è la Serial.available() >=2.
Avatar utente
Foto Utentealien75
1 1 4 7
Sostenitore
Sostenitore
 
Messaggi: 597
Iscritto il: 31 lug 2011, 14:08

0
voti

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

Messaggioda Foto Utenteboiler » 27 feb 2026, 22:13

Allora modificalo in
Codice: Seleziona tutto
Serial.available() >0

e vedi se arriva qualcosa.
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

0
voti

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

Messaggioda Foto Utentealien75 » 28 feb 2026, 6:19

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.
Avatar utente
Foto Utentealien75
1 1 4 7
Sostenitore
Sostenitore
 
Messaggi: 597
Iscritto il: 31 lug 2011, 14:08

0
voti

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

Messaggioda Foto Utenteboiler » 28 feb 2026, 9:34

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.
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

0
voti

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

Messaggioda Foto Utentealien75 » 28 feb 2026, 9:49

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.
Avatar utente
Foto Utentealien75
1 1 4 7
Sostenitore
Sostenitore
 
Messaggi: 597
Iscritto il: 31 lug 2011, 14:08

0
voti

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

Messaggioda Foto Utenteboiler » 28 feb 2026, 9:55

Perché devi spostare la linea con println al di fuori del while loop.
Inoltre perché adesso c'è un secondo while all'interno del primo?
Ultima modifica di Foto Utenteboiler il 28 feb 2026, 9:58, modificato 1 volta in totale.
Motivazione: refuso
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

0
voti

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

Messaggioda Foto Utentealien75 » 28 feb 2026, 9:58

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){}.
Avatar utente
Foto Utentealien75
1 1 4 7
Sostenitore
Sostenitore
 
Messaggi: 597
Iscritto il: 31 lug 2011, 14:08

0
voti

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

Messaggioda Foto Utenteboiler » 28 feb 2026, 10:00

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.
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

Prossimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti