Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide svp ( erreur comparaison )

Sujet résolu
    19 mai 2013 à 12:47:03

    bonjour , 

      j'ai un probleme dans mon code au niveau de la fonction loop() , je veux compare le code lu par le module RFID et le compare avec le code stoke dans le tableau card[4],pur affiche si c'est une card autorise ou nn ,    mais ca marche pas la comparaison , ca donne erreur, voila mon coe et merci d'avance : 

    #include <LiquidCrystal.h>
    
    
    // initializes the library with the interface pins
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    
    
    boolean end_of_frame = false;
    int digit;
    int test,i;
    int char_received = 0;
    byte HEX_number[4], C, val;
    
    byte card[4] = { '8A' , '5C' , '11' , 6b' };
    
    void serial_init()
    { Serial.begin(115200);                                    
      Serial.println("RFID");
     } 
    void serial1_init()
    { Serial1.begin(9600);
      delay(10);
     Serial1.write(0x02); 
    }  
    void lcd_init()
    {lcd.begin(16, 2);   
     lcd.setCursor(0, 0);
     lcd.print("  ");
    }
    
    
    /*********************************************************************************************************/
    void setup() 
    {
      serial_init();
      lcd_init();
       serial1_init(); 
     }
     
    /**********************************************************************************************************/
    
    void loop() 
    {  // read numeric DATA coming from the RFID module and send it to the serial monitor
    
      int j=0,i,test=0;
    
      while (Serial1.available())
      {
        HEX_number[j] = Serial1.read();     //la lecture du code ce fai 2 par 2 ca veux dire 
        j++;                                    // pour le code suivant : 3A 5B AA 11  la lecteur ce fai : 3A puis 5B puis AA ...
        if (HEX_number[j] < 10)                   // donc je fai la lecture et je stok la code dans un tableau hex_number[4]
              Serial.print("0");
              
              end_of_frame = true;   // apres avoir lu l ensemble du code et le stok d'un tableau on passe pour le test
      }
    	 
      delay(500);  
    
      if (end_of_frame)  // si la code cmplet a ete lu
      {
        Serial.println();
     
    
                 for(i=0;i<4;i++)   // j'affiche le code stoke dans le tableau  dans le serie monitoring 
    	 {   Serial.print(HEX_number[i], HEX); // display in HEX
                 Serial.print(" ");
    	  }
    
          // alors ici le probleme : je veux mtn compare ce tableau avec un tableau ( declare au dessu )pour voir et affiche si card autorise ou nn
    	test=0;
            for(i=0;i<4;i++) 
              if(HEX_number[i]!=card[i])
                   test=1; 
       
                 if(test==0)    
             {  lcd.setCursor(0, 1);   
                lcd.print("Autorise"); }	
    
          	delay(500);
        
        end_of_frame = false;
    	
      }  
    }  
    



    • Partager sur Facebook
    • Partager sur Twitter

    The wings of Technology

      19 mai 2013 à 14:25:42

      Je ne sais pas si c'est ça qui produit l'erreur mais il manque un guillemet à la déclaration du tableau :

      byte card[4] = { '8A' , '5C' , '11' , 6b' };

      Remplace 6b' par '6b'.

      Bonne journée

      Teguad

      -
      Edité par Teguad 19 mai 2013 à 14:28:02

      • Partager sur Facebook
      • Partager sur Twitter
        19 mai 2013 à 14:28:20

        Ton code à un souci d'indentation, quand on le colle dans un IDE capable d'indeter automatiquement (Ctrl+T dans arduino IDE) il dit qu'il y a trop d'accolades fermantes... Du coup petite question : Est-ce que ton code compile chez toi ? si oui as tu copié le même code ici ?
        • Partager sur Facebook
        • Partager sur Twitter

        Retrouvez moi sur mon blog et ma chaine Youtube !

          19 mai 2013 à 14:29:07

          grilled par Teguad que je plussoie...

          Au passage je me permet d'émettre un doute sur la partie de "lecture" du code envoyé sur Serial 1 (ligne 47 à 55)

          -
          Edité par Eskimon 19 mai 2013 à 14:33:37

          • Partager sur Facebook
          • Partager sur Twitter

          Retrouvez moi sur mon blog et ma chaine Youtube !

            19 mai 2013 à 15:44:42

            le code ca ce compile bien , mai le probleme c dan la comparaison , normalement je fai passe la card contient meme code donc il doit afiche autorise dans lcd mais ce nes pas le cas : voila encore le code a 100% ce compile dans le logiciel (arduino ) 

            #include <LiquidCrystal.h>
            
            
            // initializes the library with the interface pins
            LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
            
            
            boolean end_of_frame = false;
            int digit;
            int test,i;
            int char_received = 0;
            byte HEX_number[4], C, val;
            
            byte card[4] = { '8A' , '5C' , '11' , '6b' };
            
            void serial_init()
            { Serial.begin(115200);                                    
              Serial.println("RFID");
             } 
            void serial1_init()
            { Serial1.begin(9600);
              delay(10);
             Serial1.write(0x02); 
            }  
            void lcd_init()
            {lcd.begin(16, 2);   
             lcd.setCursor(0, 0);
             lcd.print("  ");
            }
            
            
            /*********************************************************************************************************/
            void setup() 
            {
              serial_init();
              lcd_init();
               serial1_init(); 
             }
             
            /**********************************************************************************************************/
            
            void loop() 
            {  // read numeric DATA coming from the RFID module and send it to the serial monitor
            
              int j=0,i,test=0;
            
              while (Serial1.available())
              {
                HEX_number[j] = Serial1.read();     //la lecture du code ce fai 2 par 2 ca veux dire 
                j++;                                    // pour le code suivant : 3A 5B AA 11  la lecteur ce fai : 3A puis 5B puis AA ...
                if (HEX_number[j] < 10)                   // donc je fai la lecture et je stok la code dans un tableau hex_number[4]
                      Serial.print("0");
                      
                      end_of_frame = true;   // apres avoir lu l ensemble du code et le stok d'un tableau on passe pour le test
              }
            	 
              delay(500);  
            
              if (end_of_frame)  // si la code cmplet a ete lu
              {
                Serial.println();
             
            
                         for(i=0;i<4;i++)   // j'affiche le code stoke dans le tableau  dans le serie monitoring 
            	 {   Serial.print(HEX_number[i], HEX); // display in HEX
                         Serial.print(" ");
            	  }
            
                  // alors ici le probleme : je veux mtn compare ce tableau avec un tableau ( declare au dessu )pour voir et affiche si card autorise ou nn
            	test=0;
                    for(i=0;i<4;i++) 
                      if(HEX_number[i]!=card[i])
                           test=1; 
               
                         if(test==0)    
                     {  lcd.setCursor(0, 1);   
                        lcd.print("Autorise"); }	
            
                  	delay(500);
                
                end_of_frame = false;
            	
              }  
            }  
            



            • Partager sur Facebook
            • Partager sur Twitter

            The wings of Technology

              19 mai 2013 à 20:36:36

              ta ligne 54 tu veux qu'elle soit dans le if ? car vu l'indentation on dirait que oui mais c'est pas le cas pour l'instant..
              • Partager sur Facebook
              • Partager sur Twitter

              Retrouvez moi sur mon blog et ma chaine Youtube !

                19 mai 2013 à 21:56:50

                le probleme c au niveau de la comparaison ( ligne 72 ) comparaison entre le code lu d'apres le RFID et le code stoke dans le tableau hex_number, erreur de type ou genre comme ca
                • Partager sur Facebook
                • Partager sur Twitter

                The wings of Technology

                  19 mai 2013 à 22:20:23

                  GenHicham : Je trouve ca plutot correcte, il cherche à comparer un byte avec un byte ca me semble cohérent...

                  Par contre pour faire avancer le truc, quand tu lis une carte, que te renvoi la ligne 65 ?

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Retrouvez moi sur mon blog et ma chaine Youtube !

                    19 mai 2013 à 22:43:16

                    alors j explique :  j utilise un arduino mega 2560 avec un RFID 13 hz , branche en serie . donc le elcteur rfid fai la lecture des code de cet taille :  8A3C112B  par exemple . 

                    alors : ici je fai la lecture du code et je stoke dans un tableau de 4 case : hex_number[4], pk 4 ? car la lecture du code ce fai 2 par 2 : 8A puis apres reboucle 3C puis 11 puis 28 , donc je fais la lecture et je stok dans le tableau.

                     while (Serial1.available())
                      {
                        HEX_number[j] = Serial1.read();     //la lecture du code ce fai 2 par 2 ca veux dire
                        j++;                                    // pour le code suivant : 3A 5B AA 11  la lecteur ce fai : 3A puis 5B puis AA ...
                        if (HEX_number[j] < 10)                   // donc je fai la lecture et je stok la code dans un tableau hex_number[4]
                              Serial.print("0");
                               
                              end_of_frame = true;   // apres avoir lu l ensemble du code et le stok d'un tableau on passe pour le test
                      }

                     maintenant j ai fai la lecture du code complet , je sorte de la boucle : et je fai l'affichage du code dans le serie monitoring : et bien sur ca marche bien il m'affiche

                     8A 3C 11 2B , c bien jusqu'a mtn.

                       for(i=0;i<4;i++)   // j'affiche le code stoke dans le tableau  dans le serie monitoring
                         {   Serial.print(HEX_number[i], HEX); // display in HEX
                                 Serial.print(" ");
                          }



                    alors maintenant je veux faire le test entre ce code lu , avec un code stoke dans un tableau que j ai déjà créer et déjà initialise (  card[] ). si il sont egaux ca veux dire les 2 tableau sont égaux j affiche " autorise dans LCD. et c est la ou il y a le problème , il n’affiche pas cet autorise

                     test=0;
                            for(i=0;i<4;i++)
                              if(HEX_number[i]!=card[i])
                                   test=1;
                        
                                 if(test==0)   
                             {  lcd.setCursor(0, 1);  
                                lcd.print("Autorise"); }   



                    • Partager sur Facebook
                    • Partager sur Twitter

                    The wings of Technology

                      19 mai 2013 à 22:45:29

                      et enfet oui , c'ete ca mon idee compare byte avec byte , mais ca marche pas du tou , il n'affiche tjr pas "autorise" :s
                      • Partager sur Facebook
                      • Partager sur Twitter

                      The wings of Technology

                        19 mai 2013 à 23:02:02

                        Avant la dernière partie, celle du test byte à byte, tu peux me dire ce qu'affiche ceci :

                        for(i=0;i<4;i++)
                        {
                           Serial.print(HEX_number[i], HEX); // la lecture
                           Serial.print(" ");
                           Serial.println(card[i], HEX); // la reference
                        }


                        Tu peux insérer ligne 58 par exemple

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Retrouvez moi sur mon blog et ma chaine Youtube !

                          19 mai 2013 à 23:38:44

                          Oui,alors pour le code lu : cete normalement 3ABD9423 et il affiche bien 3A BD 94 23
                          pour la 2eme  Serial.println(card[i], HEX); ,   il affiche :  41 43 31 62       alors que j ai déclaré  <<  byte card[4] = { '8A' , '5C' , '11' , '6b' };
                          donc je crois c ici le probleme :s
                          • Partager sur Facebook
                          • Partager sur Twitter

                          The wings of Technology

                            20 mai 2013 à 11:48:17

                            J'ai trouvé !!

                            Essaie de déclarer ton tableau comme suit :

                            byte card[4] = { 0x8A , 0x5C , 0x11 , 0x6b };



                            • Partager sur Facebook
                            • Partager sur Twitter

                            Retrouvez moi sur mon blog et ma chaine Youtube !

                              20 mai 2013 à 13:13:51

                              Oh ca marche parfaitement hh lol , vous êtes un génie lol , merci bcp pour votre aide , et en fait tu peu m'explique pk cette methode ca marche et l autre non ? ^^
                              • Partager sur Facebook
                              • Partager sur Twitter

                              The wings of Technology

                                20 mai 2013 à 13:55:48

                                En fait tu cherches à comparer des nombres codés en hexadécimal. Pour les écrires on utilise donc ce format avec 0x..

                                En faisant comme tu faisais avant, tu enregistrais des caractères et d'ailleurs au passage, on aurait du le voir avant mais l'écriture était fausse. En effet, un caractère s'écrit entouré de guillemets simple comme 'A' par exemple. C'est complètement différent d'un numéro hexadécimal. Pour les lires il faut utiliser une table ASCII.

                                Par exemple, les trois écritures suivantes sont exactement egales :

                                byte A = 'A';
                                //est pareil que
                                byte A = 65; //en décimal
                                //ou encore
                                byte A = Ox41; //en hexadécimal
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Retrouvez moi sur mon blog et ma chaine Youtube !

                                Aide svp ( erreur comparaison )

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown