Merci claudius01, je viens juste de m'apercevoir de cette erreur qui est due ... à 6 mois de programmation en Pascal ou le test se fait par un signe = et non pas un == comme cela doit être fait en c.
et si vous voulez détecter une entrée illégale il ne faut pas utiliser toInt() qui va vous dire 0 sans moyen de savoir si c'était vraiment 0 ou si c'était une entrée erronée
int16_t pitch = 20, roll = 30;
String str = "";
void setup()
{
Serial.begin(115200);
Serial.setTimeout(100);
Serial.println("prêt");
}
void loop() {
if (Serial.available()) {
str = Serial.readStringUntil('\n');
char cmd = str[0];
char* endPtr;
long value = strtol(str.c_str() + 1, &endPtr, 10);
if (endPtr == str.c_str() + 1) {
Serial.print("Erreur : valeur non valide pour la commande ");
Serial.println(str);
return;
}
switch (cmd) {
case 'r':
roll = value;
Serial.print("Nouveau roll = ");
Serial.println(roll);
break;
case 'p':
pitch = value;
Serial.print("Nouveau pitch = ");
Serial.println(pitch);
break;
default:
Serial.print("Commande inconnue ");
Serial.println(str);
break;
}
}
}
vous pourriez aussi rajouter un test sur value si elle sort des valeurs admissibles dans le switch/case
Si vous voulez pouvoir taper la commande en minuscule ou majuscule faites
switch (tolower(cmd)) { // on met la commande en minuscule
...
PS: notez que Serial.readStringUntil() est bloquant jusqu'à la fin de la réception de la commande donc à 38400 la réception de 5 caractères prendra 1.3ms - ça parait peu mais ça dépend de ce que le reste du code fait ou doit faire.
en passant comme dans mon exemple le terminal à 115200 bauds, on attend moins longtemps (0.4ms)
si vous voulez faire du totalement non bloquant il ne faut pas utiliser Serial.readStringUntil