Go Down

Topic: RFID Probleme de comparaison (Read 1 time) previous topic - next topic

lastiko

bonsoir
Voila j'ai reçu le lecteur RFID
apres un rapide test , je vois bien les codes RFID ,mais je n'arrive pas a faire une comparaison pour autoriser tels ou tels badge :(

Code: [Select]
char code[10];

char tag1[10] = {'2','8','0','0','1','D','5','3','5','7'}; //define tag 1


et je tente la comparaison comme cela

Code: [Select]
if(strcmp(code, tag1) == 1) //compare tag1 to the tag read
        {
          digitalWrite(ledPin, HIGH);
          Serial.print("bingo trouvé ");
        }


mais cela ne marche pas

fdufnews

#1
Aug 26, 2010, 10:34 pm Last Edit: Aug 26, 2010, 10:49 pm by fdufnews Reason: 1
Quote
strcmp(code, tag1)

As-tu fait afficher le contenu de la variable code pour essayer de comprendre pourquoi le programme ne fonctionne pas?

lastiko

#2
Aug 26, 2010, 11:33 pm Last Edit: Aug 26, 2010, 11:36 pm by lastiko Reason: 1
oui c'est bien ce qui m'etonne
en faite j'ai trouvé une solution mais j'ai 2 badges qui sont valides alors qu'ils ont bien un numero différent

Code: [Select]
if(strcmp(code, "28001D5357") != 1) // comparaison du code RFID
      {
          digitalWrite(ledPin, HIGH);
          Serial.print("badge trouvé : ");
          delay(2000);
          digitalWrite(ledPin, LOW);          // Turn off debug LED
         
         
        }
        else
        {
          Serial.print("Refusé ");
        }



si je passe le badge 24008E5FE7 ca me dit aussi que c'est le bon badge
alors que les autres que j'ai ca me dis refusé
La c'est le grand mistére >:(

fdufnews

#3
Aug 27, 2010, 08:41 am Last Edit: Aug 27, 2010, 08:41 am by fdufnews Reason: 1
Oups j'avais pas fait attention à la première lecture, tes tableaux ne sont pas bien définis.
strcmp travaille avec des chaines. Les chaines doivent se terminer par un \0.
Donc:
   1) il faut 1 élément de plus à tes tableaux
   2) il faut penser à ajouter le terminateur

Code: [Select]
char code[11];

char tag1[11] = {'2','8','0','0','1','D','5','3','5','7','\0'}; //define tag 1


A mon avis si ton programme te répond OK sur un badge c'est un coup de bol ou un bug.

B@tto

#4
Aug 27, 2010, 08:45 am Last Edit: Aug 27, 2010, 08:45 am by B@tto Reason: 1
Librairie Pstring sinon:

http://arduiniana.org/libraries/pstring/
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

fdufnews

#5
Aug 27, 2010, 10:48 am Last Edit: Aug 27, 2010, 10:48 am by fdufnews Reason: 1
Quote
Librairie Pstring sinon:

Cette librairie n'est utilisable que pour faire des impressions. Là le problème c'est du traitement sur les chaines.

Maintenant, si lastiko rencontre des problèmes d'occupation mémoire (la librairie String est assez volumineuse) et qu'il n'utilise que strcmp la fonction peut être réécrite.

B@tto

Quote
Cette librairie n'est utilisable que pour faire des impressions.


Tu peux faire de la comparaison de chaines :

Operators
PString provides three operators for assignment, concatenation, and equivalency test:

char buffer[20];
PString str(buffer, sizeof(buffer));
str = "Yin"; // assignment
str += " Yang"; // concatenation
if (str == "Yin Yang") // comparison
{
 Serial.println("They are equal!");
}
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

fdufnews

Merci B@tto, je m'étais arrêté au titre et aux premières lignes de description de la librairie et je n'avais pas vu les opérateurs.
Cette librairie est intéressante, je crois bien que je vais la récupérer.

lastiko

merci pour vos aides

char tag1[11] = {'2','8','0','0','1','D','5','3','5','7','\0'}; //define tag 1

Les chaines doivent se terminer par un \0.

ca correspond a quoi ?

fdufnews

#9
Aug 27, 2010, 01:41 pm Last Edit: Aug 27, 2010, 01:44 pm by fdufnews Reason: 1
Quote
char tag1[11] = {'2','8','0','0','1','D','5','3','5','7','\0'}; //define tag 1
Les chaines doivent se terminer par un \0.
ca correspond a quoi ?

Ça correspond à la définition d'une chaine en C.
En C une chaine de caractères doit se terminer par un null.
Le null peut s'écrire de différentes façon.
 caractère '\0'
 byte 0

Donc on peut écrire:
Quote
char tag1[11] = {'2','8','0','0','1','D','5','3','5','7','\0'};
ou
char tag1[11] = {'2','8','0','0','1','D','5','3','5','7',0};


Une chaine vide c'est:
Quote
char tag1[11] = {'\0'};


Quand on définit une chaine avec des guillemets, le \0 est implicitement ajouté par le compilateur.

lastiko

merci pour cette info bien utile, je comprends mieux maintenant pourquoi la comparaison ne fonctionné pas super bien

lastiko

#11
Aug 28, 2010, 03:16 pm Last Edit: Aug 28, 2010, 03:17 pm by lastiko Reason: 1
un grand merci a B@tto , ca marche nikel avec Pstring

Par contre je n'ai pas réussi avec le code précédent et l'histoire de 0 a la fin

si quelqu'un a le courage de me montrer un code qui compare avec cette methode je suis preneur , histoire de comprendre et de ne plus poser cette question a l'avenir

Go Up