const byte longeurMaxMessage = 30;
char message[longeurMaxMessage + 1]; // + 1 pour le caractère nul en fin de chaîne
bool messageDisponible(const char marqueurDeFin = '\n') {
static byte indiceEnCours = 0;
int r = Serial.read();
if (r == -1) return false; // Il n'y a rien à lire
if (r == marqueurDeFin) { // si c'est le marqueur de fin
message[indiceEnCours] = '\0'; // on termine la c-string
indiceEnCours = 0; // on se prépare pour la prochaine fois
return true; // on dit que le message est disponible
}
if (indiceEnCours < longeurMaxMessage) { // s'il y a encore de la place
message[indiceEnCours++] = r; // on stocke le caractère et incrémente l'indice
}
return false; // Le message n'est pas terminé
}
void traiterCommande(const char * element) {
Serial.print("Element \"");
Serial.print(element);
Serial.println("\"");
}
void traiterMessage(const char separateur = ',') {
Serial.print("J'analyse \"");
Serial.print(message);
Serial.println("\"");
char * debutCommande = message;
char * virgulePtr;
do {
virgulePtr = strchr(debutCommande, separateur);
if (virgulePtr == nullptr) { // il n'y a plus de séparateur
traiterCommande(debutCommande);
break;
} else {
*virgulePtr = '\0'; // on coupe la chaîne à cet endroit
traiterCommande(debutCommande); // on effectue l'analyse
*virgulePtr = separateur; // on remet comme c'était
debutCommande = virgulePtr + 1; // on continue l'exploration après la virgule
}
} while (*debutCommande != '\0'); // on continue tant qu'on n'est pas au bout (pas de caractère nul pointé par debut)
}
void setup() {
Serial.begin(115200); Serial.println();
Serial.println("Entrez des commandes séparées par des virgules.");
}
void loop() {
if (messageDisponible()) {
traiterMessage();
}
}