error: previously used here

Ciao a tutti,
quando compilo lo sketch sotto, il log mi dice:

sketch_apr01a:51: error: duplicate case value
sketch_apr01a:33: error: previously used here

e mi evidenzia solamente:

case 'beacon-on':

Perchè ?

#define landing 50
#define beacon 51
#define nav 52
#define nav_sync 53

char rx = 0;

void setup() {
  pinMode(landing, OUTPUT);
  pinMode(beacon, OUTPUT);
  pinMode(nav, OUTPUT);
  pinMode(nav_sync, OUTPUT);
 
  Serial.begin(9600);
  Serial.println("Seriale avviata");
 
  digitalWrite(landing, LOW);
  digitalWrite(beacon, LOW);
  digitalWrite(nav, LOW);
  digitalWrite(nav_sync, LOW); 
};

void loop() {
  if (Serial.available() >0)
    {
      rx = Serial.read();
      Serial.flush();
      
      switch(rx) {
        case 'landing-on':
          digitalWrite(landing, HIGH);
          break;
        case 'landing-off':
          digitalWrite(landing, LOW);
          break;
        case 'beacon-on':
          digitalWrite(beacon, HIGH);
          break;
        case 'beacon-off':
          digitalWrite(beacon, LOW);
          break;
        case 'nav-on':
          digitalWrite(nav, HIGH);
          break;
        case 'nav-off':
          digitalWrite(nav, LOW);
          break;
        case 'nav_sync-on':
          digitalWrite(nav_sync, HIGH);
          break;
        case 'nav_sync-off':
          digitalWrite(nav_sync, LOW);
          break;
        }
    }
}

grazie

  1. Il switch-case accetta solo valori numerici (char singolo accetta, è un valore numerico), perciò no a stringhe.
    2 la read() precedente legge solo un carattere
  2. se usi apici singoli il compilatore accetta ma vede solo il primo char
    praticamente questo: 'beacon-off' e 'beacon-on' vede solo 'b' che poi è il valore 98

Quindi non posso usare comandi lunghi, come sopra ?
Devo andare di if ? :confused:

NO, li puoi usare, ma prima :

  1. li devi ricevere in un loop, carattere a carattere dalla seriale ...
  2. li devi identificare e magari associare an un singolo valore numerico (lookup table ?) ...
  3. infine puoi usare la switch :grin:

Guglielmo

Me ne vado di if hihihihi
Però sta cosa non la capisco, che senso ha ? Boh

Il problema non cambia ...
... devi comunque riceverli e capire quale è il comando ... :wink:

il modo più semplice è avere un array bidimensionale, ogni riga contiene un comando, cerchi a che riga sta e quello ti identifica il numero di comando, fai una switch .. e hai risolto alla velocità della luce :smiley: :smiley: :smiley:

Guglielmo

Uhm, non ho ben capito, ma domani faccio delle prove e vedo :slight_smile:

Allora, ti crei un array di array di char … esempio, 10 comandi da 20 char massimi cad (ricorda lo 0x00 terminatore di stringa)

char mieiComandi[10][20] = {"comando1", "comando2", "comando3", ..., "comando10"};

dalla seriale ricevi carattere a carattere il tuo comando e lo metti in comandoRx definito come :

char comandoRx[20];

fai un ciclo di for e compari il comando ricevuto con gli elementi del vettore con una strcmp() … nel momento in cui la strcmp() ti da uguaglianza, l’indice del for ti dice quale è l’elemento dove ha trovato la stringa … e quell’indice quindi ti identifica il comando e lo puoi usare nella switch :wink:

semplice e veloce … XD

Guglielmo

... per inciso, strcmp() la trovi in string.h ... libreria standard dei AVR libc che viene automaticamente inclusa dal compilatore ... QUI le varie funzioni :wink:

Guglielmo

Puoi al massimo usare delle if ma SOLO se usi l'oggetto String (che sconsiglio) perchè la classe ha l'overloading dell'opeazione del confronto ==. Uno switch non usa l'operatore == .
Stiamo parlando di C/C++ non di Basic (che accetta invece if myStr="Pippo" Then e perciò anche Select Case funziona)
Se usi le stringhe del C (non l'oggetto String) mica puoi usare == è un vettore di caratteri, mica puoi confrontare due vettori, devi usare string compare strcmp()

anerDev:
Però sta cosa non la capisco, che senso ha ? Boh

Perché il linguaggio è di basso livello ed è stato strutturato così. :stuck_out_tongue: :stuck_out_tongue: