Problema con codice Arduino per ricezione ed invio via seriale [RISOLTO]

Ciao a tutti.

E' da qualche giorno che ho problemi con un progetto che ho in mente.

In pratica, ho scritto un programma C# che dovrebbe gestire Arduino tramite messaggi seriali.
Il programma invia un valore compreso tra 1 e 255, per controllare un led RGB.

Per fare questo ho programmato Arduino nel seguente modo:

void setup() {
  Serial.begin(9600);

  int verde = 2;
  int blu = 3;
  int rosso = 4;
  
  pinMode(blu, OUTPUT);
  pinMode(rosso, OUTPUT);
  pinMode(verde, OUTPUT); 

}

void loop() {
  int verde = 2;
  int blu = 3;
  int rosso = 4;
  
  if(Serial.available() > 0) {
    
    int inByte = Serial.read();
    switch(inByte){
      
      
      case '1':
      Serial.println("5");
      int PWM = Serial.parseInt();
      analogWrite (verde, PWM);
      break;
      
      case '2':
      Serial.println("6");
      int PWM2 = Serial.parseInt();
      analogWrite (rosso, PWM2);
      break;
      
      case '3':
      Serial.println("7");
      int PWM3 = Serial.parseInt();
      analogWrite (blu, PWM3);
      break;

      
      
      
      
      }
    while (Serial.available()) {
     byte a = Serial.read();
     }
    
    
    }

}

Il programma invia ad arduino un messaggio seriale, che può essere "1" "2" o "3".
Arduino dovrebbe rispondere con "5" "6" o "7" e, una volta che il programma ha ricevuto la conferma, dovrebbe inviare ad Arduino il valore di PWM deciso dall'utente.

Il problema è che Arduino risponde solo al messaggio "1", mentre ignora completamente gli altri due messaggi.

Lo so perchè, aprendo il monitor seriale e mandandogli a mano il comando non risponde scrivendo "2" oppure "3" mentre risponde correttamente se gli scrivo "1".

Se tolgo la parte di codice relativa al PWM da tutti e tre i casi descritti invece funziona tutto e Arduino torna a rispondere correttamente ai messaggi.

L'arduino è un MEGA con Microcontrollore 2560. Per ora non mi aveva dato problemi.

Se qualcuno sapesse darmi qualche suggerimento glie ne sarei davvero grato.

Grazie e buon proseguimento a tutti.

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

gpb01:
Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

ecco fatto!

Be io per prima cosa cambierei int in char e ottengo lo stesso risultato,con monitor seriale, dopo un serila.read(), stampo quello che ricevo sulla seriale per controllare cosa effettivamente riceve arduino.

 char inByte = Serial.read();
 Serial.print("ricevo ->  ");
 Serial.println(inByte);

Poi all'interno dei case, dovresti mettere una pausa while(!Serial.available()); //punto e virgola, che attende che ci siano dati sulla seriale prima di leggere il dato.

torn24:
Be io per prima cosa cambierei int in char e ottengo lo stesso risultato,con monitor seriale, dopo un serila.read(), stampo quello che ricevo sulla seriale per controllare cosa effettivamente riceve arduino.

 char inByte = Serial.read();

Serial.print("ricevo ->  ");
Serial.println(inByte);




Poi all'interno dei case, dovresti mettere una pausa while(!Serial.available()); //punto e virgola, che attende che ci siano dati sulla seriale prima di leggere il dato.

Ok, grazie per la risposta.

Dunque, ho messo la variabile inByte come char e ho messo Serial.println(inByte); dentro ogni case, per vedere cosa riceve effettivamente arduino.

Aprendo il monitor seriale, mi sono accorto che arduino riceve il messaggio che gli mando solo nel primo caso, ovvero quello in cui si aspetta "1" come comando. Negli altri casi non riceve nulla.

Non ho capito dove andrebbe messa la pausa nel case, ovvero (!Serial.available()); che hai descritto.

intanto, grazie per la pazienza.

Sisco87:
Non ho capito dove andrebbe messa la pausa nel case, ovvero (!Serial.available()); che hai descritto.

Prima delle parseInt()

Ma se commenti la parte PWM intendi che togli anche le parseInt() ? Quelle leggono da seriale.
Ed il ciclo a vuoto dopo di lettura su variabile "a" a che serve ??
La parseInt() la fai subito dopo invio di "5" ma la connessione potrebbe anche cadere. La parteint() devi verificare ci siano dati con Serial.available() come detto da @torn24 oppure con il valore ritornato che può essere 0 dopo un timeout (vedi Serial.setTimeout() )

Altro consiglio, le dichiarazioni di verde, blu rosso, mettile una volta sola prima della setup()

Ho risolto :o

in pratica, è bastato mettere le graffe dopo la dichiarazione case:

per esempio

case 'a':
      {
      //Serial.println(inByte); 
      Serial.println('5');
      int PWM = Serial.parseInt();
      analogWrite (verde, PWM);
      while(!Serial.available()) 
      { }
      break;
      }

e tutto fila liscio.
molto utili i consigli per debuggare, in ogni caso ringrazio.

Buona giornata a tutti quanti, un saluto!

Quelle due graffe non servono a nulla. In realtà hai fatto di più di mettere 2 graffe, hai spostato quel ciclo while di attesa su serial.available(), che ti tiene nel case finché non arriva altro da seriale.
Mi pare che il programma sia strutturato male.
Se posti tutto potremmo aiutarti meglio.