IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Soucis avec des switch / case/ break imbriqués


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Soucis avec des switch / case/ break imbriqués
    Bonjour a tous,

    Je m'ennuis durant les vacances scolaires , ....Je débute en C ....

    Je m'amuse à dev 2 applications en parallèle:

    1 sur arduino ( en C) et une en C sur Labwindows sur un PC, l'objectif et de les faire communiquer via le port série.

    pour l'instant je galère dans le sens Data envoyé par l'arduino:

    j'envois grâce à println "I31H";
    I correspondant à Input
    31 à la patte d'entrée de mon Arduino Méga
    H : état haut ( HIGH)

    j utilise les 10 pattes numérotés: (31,33,35,37,39,41,43,45,47,49)
    C'est une convention que je me suis fixé

    Le println envois aussi (\r\n)

    donc 6 caractères.

    en utilisant un moniteur du port série: ça marche je reçois bien les données sous le format
    ( j'ai fait un tout petit script, qui mets à l'état haut, puis bas une sortie après l'autre toute les 500 ms, juste pour le test.

    Extrait: copie d'écran de la réception des trames envoyées

    Nom : 2018-08-10 20_43_20-Serial Communication Example.png
Affichages : 314
Taille : 9,0 Ko

    juste un petit extrait ( car le problème n'est pas là) ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
     
    Serial.println ("I31H");
    delay(500);
    Serial.println ("I31L");
    delay(500);
     
    Serial.println ("I33H");
    delay(500);
    Serial.println ("I33L");
    delay(500);
     
    Serial.println ("I35H");
    delay(500);
    Serial.println ("I35L");
    delay(500);
     
    Serial.println ("I37H");
    delay(500);
    Serial.println ("I37L");
    delay(500);
     
    Serial.println ("I39H");
    delay(500);
    Serial.println ("I39L");
    delay(500);
     
    Serial.println ("I41H");
    delay(500);
    Serial.println ("I47L");
    delay(500);
     
    Serial.println ("I49H");
    delay(500);
    Serial.println ("I49L");
    delay(500);
    coté PC, je suis sous Labwindows 2010

    Mon soucis se situe au niveau de décodage du message , seul les 2 derniers messages fonctionnent et je pense avoir un soucis dans
    des swith case imbriqués

    je m'en sert pour "décoder" caractère par caractère du buffer d'entrée

    Le compilateur me donne pas d'erreur ( normale, je ne dois pas avec d'erreur de syntaxe) les prototypes, déclaration sont bonnes:
    le InBuffer contient bien 6 caratères ( les bons ...)


    Mais qu'une erreur de logique....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
     
     
    void ParseData(char *inBuffer)
    {
       switch (inBuffer [0])
    	{
    	   case 'I':
    	   {
    	   		ParceBouton(inBuffer);
    	   		break;
    	   }
     
    	   case 'P':
    	   {
    		   ParcePotar(inBuffer);  
    	   		break;
    	   }
    	}
     
    }	
     
    void ParceBouton(char *inBuffer)
    {
       switch (inBuffer[1])  //donc Ixx
       {
    	   case '3':	     // donc I3x
    		   switch (inBuffer[2])
    		   {
    			   case '1':		  // pour I31
    				{   
    				   switch (inBuffer[3])
    					 {
    						case 'H': SetCtrlVal(PANEL,PANEL_LED31,1);
    						break;	   
     
    				  		case 'L': SetCtrlVal(PANEL,PANEL_LED31,0);
    						break;	   
     
    					 }
    				break; // break du case '1'
    				}  
     
     
    			   case '3':		   // pour 33
    				{   
    				   switch (inBuffer[3])
    					 {
    					   	case 'H':SetCtrlVal(PANEL,PANEL_LED33,1);
    					   	break;	   
     
    				   		case 'L':SetCtrlVal(PANEL,PANEL_LED33,0);
    						break;	   
     
    					 }
    				   break;
    				}
     
    			   case '5':		   // pour I35
    				{   
    				   switch (inBuffer[3])
    					 {
    					   	case 'H':SetCtrlVal(PANEL,PANEL_LED35,1);
    						break;	   
     
    				  		case 'L':SetCtrlVal(PANEL,PANEL_LED35,0);
    						break;	   
     
    					 }
     
    				   break;
    				}  
     
     
    				case '7':		  
    				{   
    				   switch (inBuffer[3])
    					 {
    					   	case 'H':SetCtrlVal(PANEL,PANEL_LED37,1);
    						break;	   
     
    				  		case 'L':  SetCtrlVal(PANEL,PANEL_LED37,0);
    						break;	   
     
    					 }
    				   break;
    				}  
     
     
    				 case '9':		   // pour I39
    				 {   
    				   switch (inBuffer[3])
    					 {
    					   	case 'H':SetCtrlVal(PANEL,PANEL_LED39,1);
    						break;	   
     
    				  		case 'L':SetCtrlVal(PANEL,PANEL_LED39,0);
    						break;	   
     
    					 }
    				   break;
    				}  
     
     
     
     
     
     
    			//Pour 41
    		case '4':	     // donc I4x
    		   switch (inBuffer[2])
    		   {
    			   case '1':		  // pour I41
    				{   
    				   switch (inBuffer[3])
    					 {
    					    case 'H': SetCtrlVal(PANEL,PANEL_LED41,1);
    						break;	   
     
    				  		case 'L':SetCtrlVal(PANEL,PANEL_LED41,0);
    						break;	   
    					 }
    				   break;
    				}  
     
     
    			   case '3':		   // pour 43
    				{   
    				   switch (inBuffer[3])
    					 {
    					   	case 'H':SetCtrlVal(PANEL,PANEL_LED43,1);
    						break;	   
     
    				   		case 'L':SetCtrlVal(PANEL,PANEL_LED43,0);
    						break;	   
    					  }
    				   break;
    				}	   
    			   case '5':		   // pour I45
    				{   
    				   switch (inBuffer[3])
    					 {
    					   	case 'H':SetCtrlVal(PANEL,PANEL_LED45,1);
    						break;	   
     
    				  		case 'L':SetCtrlVal(PANEL,PANEL_LED45,0);
    						break;	   
    					   }
    				   break;
    				}  
     
     
    				case '7':		   // pour I47
    				{   
    				   switch (inBuffer[3])
    					 {
    					    case 'H':SetCtrlVal(PANEL,PANEL_LED47,1);
    						break;	   
     
    				  		case 'L':SetCtrlVal(PANEL,PANEL_LED47,0);
    						break;	   
    					  }
    				   break;
    				}  
     
     
    				case '9':		   // pour I49
    				{   
    				   switch (inBuffer[3])
    					 {
    					   	case 'H':SetCtrlVal(PANEL,PANEL_LED49,1);
    						break;	   
     
    				  		case 'L':SetCtrlVal(PANEL,PANEL_LED49,0);
    						break;	   
    					  }
    				   break;
    				}  
     
     
     
    				   break;
    		   }
     
    		   break;
       }
     
    }
     
     
     
     
    void ParcePotar(char *inBuffer)
    {
    }
    il doit y avoir un soucis dans les cases, les switch, ou les break ou les {}.

    je n'ai que les 2 dernières leds qui fonctionnent (mal) d'ou mon intuition que le défaut est "bête"... (LAbwindows arrive a lire ma trame...)


    Nom : 2018-08-10 20_42_01-Arduino Manager.png
Affichages : 273
Taille : 3,9 Ko
    Merci d'avance, pour votre aide, encore désolé, je débute en C et sur ce forum ...

    Mousse

  2. #2
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 610
    Points : 1 534
    Points
    1 534
    Par défaut
    Hello,

    Plutôt que cette cascade de switch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int pin=atoi(inBuffer+1);
    Plus qu'à modifier SetCtrlVal()....
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour Monsieur,

    Merci pour votre réponse, malheureusement je ne comprends pas votre solution avec l'instruction atoi() pour eviter de cascader les switchs... (afin de décoder les données reçues)

    j'ai trouvé sur le net des information : "Cette fonction convertie une chaîne de caractères en une valeur entière «int»" or je ne pense pas que cela va resoudre mon problème, ou du moins je ne voie pas trop comment....

    Si vous pouviez m'en dire un peu plus, d'avance merci

    car je veux juste décoder ma trame caractère par caractère pour l'orienter ( aiguiller) vers la bonne led à "allumer sur le PC ( via Labwindows)
    Merci de ne pas oublier que je suis débutant.

    Mousse

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Voici un code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
     
    char inBuffer[] = "I39L";
     
    int main(void) {
        bool isButton = inBuffer[0] == 'I';
        long int number = strtoul(inBuffer + 1, NULL, 10);
        bool high = inBuffer[3] == 'H';
     
        printf("Type : %s\n", isButton ? "Button" : "???");
        printf("Number : %lu\n", number);
        printf("%s\n", high ? "High" : "Low");
    }
    Il affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Type : Button
    Number : 39
    Low
    Plutôt que atoi, j'ai choisi strtoul. atoi ne permet pas de détecter les erreurs de conversion. strtoul le permet, même si je ne le fais pas ici pour simplifier volontairement le code.

    L'idée est de dire que parser caractère par caractère n'est pas forcément une bonne idée, notamment par ce que tu trimbales partout un dernier niveau de switch pour faire la différence entre L et H.

    Une fois que tu as number, tu peux faire des switch si tu veux, ou faire une table de correspondance, pour retrouver tes PANEL_LEDXX.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Soucis de syntaxe avec un switch case
    Par Olivier Regnier dans le forum Langage
    Réponses: 1
    Dernier message: 16/08/2009, 15h33
  2. [Css]Soucis avec des div
    Par nebule dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/05/2006, 18h03
  3. [Tableaux] souci avec des simples quotes
    Par Jean Fi dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2006, 21h13
  4. [Système] Probleme avec un switch case!
    Par Death83 dans le forum Langage
    Réponses: 7
    Dernier message: 29/01/2006, 17h28
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo