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
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
Il problema non cambia ...
... devi comunque riceverli e capire quale è il comando ...
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
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
... per inciso, strcmp() la trovi in string.h ... libreria standard dei AVR libc che viene automaticamente inclusa dal compilatore ... QUI le varie funzioni
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()