[Conseil] Créer un menu ergonomique dans le port série

Bonjour,
Je souhaite créer un menu ergonomique avec le port série. Pour cela j’aimerai créer des parties et des sous parties auxquels on peut accéder grâce à un caractère entré dans le port série (ici "0", "1", "2" , "3"). Dans l’idéal, j’aimerai que lorsqu’on se trouve dans une partie (par exemple « Options » ici), on ne puisse pas entrer dans une partie d’un étage différent du nôtre (une fois dans « Options », on ne peut pas accéder à « Commande » sans ressortir de « Options »)
Voici un exemple de code :

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
if (Serial.available()) {
char data = Serial.read();
switch (data) {
case 48: //Commande
Serial.println("Options");
switch (data) {

case 49://Paramètre
Serial.println("Paramètre");
break;

case 50://Calibrage
Serial.println("Calibrage");
break;
}
break;

case 51://Commande
Serial.println("Commande");
break;
}
}
}

Après les lignes

case 48: //Commande
        Serial.println("Options");

il faut que tu relises ce qui vient de la console, sinon ton second switch(data) conserve la valeur précédente, qui vaut 48 ici. Donc, tu ne trouveras pas 49 ni 50.

Pas mal. Quel est le but de ton projet?

Sinon oui, machine à etats avec un etat par menu.

J'ai rajouté :"data = Serial.read();" juste après "Serial.println("Options");", malheureusement je n'ai toujours pas le résultat escompté, le programme ne rentre pas dans la partie " Paramètre" ou "Calibrage". Je tiens a préciser qu'une fois le programme téléversé, je note "0" dans le port série ( le programme m'affiche bien Options) et à ce moment là, j'écris "1" ( et là le programme ne m'affiche pas Paramètre).

Je travailles sur l'asservissement d'un drone. Ayant programmé plusieurs fonctionnalités, j'aimerai les rendre plus facilement accessible avec un menu ergonomique.

Juste avant le second switch, ajoute les lignes

Serial.print("***");
Serial.print(data);
Serial.println("***");

Il est fort probable que tu verras ******, c'est à dire que data n'est pas lu. Pourquoi? Parce que tu n'as pas le temps de l'entrer. Il te faut faire attendre le programme que tu écrives quelque chose dans la console. Genre un

while (!Serial.available()) ...

Mais, ton code va devenir une usine à gaz si tu dois encore faire des sous-menus.

Tu dois l'organiser autrement : si un caractère se présente, tu le lis et tu agis en conséquence. Si tu es dans le menu principal, tu vas dans le menu secondaire et tu traites les caractères 48 & 49. En gros, tu lis le caractère et tu fais une grosse liste de if qui font ce qu'il faut en fonction du contexte. Le contexte c'est une ou plusieurs variables qui te disent à quel endroit tu es de ton menu

Si vous voulez je dois avoir un vieux bout de code qui fait un truc du genre - faudrait que je fouille

en attendant Si vous voulez comprendre comment bien écouter le port série (ou gérer un flux asynchrone) vous pouvez jeter un oeil à mon petit tuto sur le sujet

J'ai retrouvé mon code qui est assez générique mais je vous laisse bosser un peu sur votre projet plutôt que de vous servir un truc tout fait :slight_smile:

Bonsoir,

Une petite astuce.

Si tu souhaites avoir une interface ergonomique je te conseil d'utiliser TeraTerm comme moniteur série.

Avec TeraTerm tu auras la possibilité d'effacer le moniteur de sorte à ce que les caractères précédemment afficher soit supprimer.

Pour cela tu a juste a utiliser la fonction suivante :

/* Clear terminal screen */ 
    printf("\x1b[2J\x1b[;H");

Sur Arduino :

/* Clear terminal screen */ 
    Serial.print("\x1b[2J\x1b[;H");

Effectivement lesept, vous avez raison, le data n'est pas lu. Toutefois je penses qu'une grosse liste de "if" rendra le programme encore plus chaotique et moins bien structuré. La solution de mettre une boucle while infinie me parait ainsi être la plus accessible et répondant à mes critères, bien qu'elle ne soit sans doute pas optimale.

J'ai regardé votre topic J-M-L, il est très bien fait, beau travail.

Je vous remercie tous pour vos réponses.

vous avez fait quelque chose? postez le :slight_smile: (si vous nous montrez votre travail, je posterais mon bout de code)