Switch case et boucle while

Bonjour à tous, Je suis en train de "fignoler" mon appli sur les vérins et je viens d'y trouver un problème. Je teste les ordres de la télécommande avec un "switch case" et effectue les traitements associés. Un des cas est traité dans une boucle "while" et dans cette boucle je dois vérifier si un autre ordre provient de la télécommande. Mais ça ne fonctionne pas. Concrètement, dans la boucle "while" de (case 'm') je dois tester l'ordre de (case 'z') JP

    case 'z': // ARRET DE LA FONCTION EN COURS
      STOP = 1;
      break;

    case 'm': // OUVERTURE DU VERIN CONCERNE 
      while (VAL_CVSAVD == LOW ) {
if (STOP == 1){
break
}
        digitalWrite (AVDRO, LOW); 
}

Hello,

il faudrait le code entier pour se faire une idée.

au passage il manque un ";" après le break du "case m".

Salut, Oui, pour le ";" il y est bien, c'est simplement un mauvais copier/coller. Sinon, concernant le code, ce serait trop lourd (env 1200 lignes). En fait ça fonctionne bien sauf ce morceau. Dans cette boucle, il ne prends pas en compte le test de la variable "STOP" déclarée dans (case 'z'). JP

ok, mais le problème ne vient peut être pas de ta boucle mais de ta condition ou tes conditions initiales etc... Entres-tu bien dans ta boucle while ? Quelles sont les valeurs de tes variables et de tes conditions ?

A moins d'un problème de syntaxe il est difficile de trouver le problème avec si peu de code. et à priori ta syntaxe est ok...

Non, tout est OK. Si je supprime mon "if" ça fonctionne. C'est bien le fait de tester une donnée de "switch case" dans un boucle while qui pose problème. JP

Si je supprime mon "if" ça fonctionne.

C'est pas tellement étonnant puisque STOP ne peut pas changer durant le while.

Je pense que ce problème est la conséquence d'une mauvaise analyse initiale. Ta boucle de traitement est mal conçu. Il faudrait que tu réexamines le fonctionnement de ta machine à états pour ne plus avoir de case bloquants.

Bonjour à tous, Le mieux est que je pose le problème. Je simplifie à l’extrême : une télécommande avec 2 ordres : 1 - Commande "Mise en marche" d'un moteur jusqu'à ce que le fin de course donne l'ordre de l’arrêter. 2 - Commande "Arrêt" à n'importe quel moment du cycle. J'ai donc un "switch case" avec 2 valeurs : "M" pour Marche et "A" pour Arrêt. La fonction "Marche" est dans un "while" qui attends donc que le fin de course coupe le moteur. Donc, comment intégrer la commande "Arrêt" dans cette boucle "while" JP

En remplaçant le while par un if?

Si j'arrive en fin de course "je fait qq chose" sinon "je fais rien" et je poursuis dans le case

J'ai donc un "switch case" avec 2 valeurs : "M" pour Marche et "A" pour Arrêt. La fonction "Marche" est dans un "while" qui attends donc que le fin de course coupe le moteur. Donc, comment intégrer la commande "Arrêt" dans cette boucle "while"

Comme je l'ai dit précédemment le problème est mal posé au départ et donc la solution est boiteuse.

Le switch case doit permettre d'allumer et d'éteindre. Il ne faut l'utiliser que pour le passage d'un état à un autre. Une fois que c'est allumé ou éteint, il n'y a aucune raison de rester bloqué dans l'un des case et tu pourrais parfaitement sortir du while pour faire autre chose comme par exemple tester des conditions externes.

Il ne faut pas perdre de vue que la fonction principale d'un sketch arduino c'est loop() comme son nom l'indique c'est une boucle. Une bonne conception logicielle doit donc tenter de ne pas bloquer cette exécution en boucle. C'est une contrainte à intégrer lorsqu'on conçoit son programme. Une boucle type pour ton besoin

début de la boucle je regarde si je reçois un ordre de ma télécommande si c'est oui changement d'état (un switch est parfait ici) Je regarde dans quel état je suis en fonction de l'état actuel je teste les conditions externes (s'il y a plusieurs états un autre switch fait l'affaire) si une condition externe se présente je gère et éventuellement je modifie l'état courant pour un nouvel état (arrêt d'urgence par exemple) fin de la boucle

Il n'y a aucun pas bloquant la boucle est parcouru en permanence