PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → RFID
RFID
Débuté par jonathan, 01 mai 2014 17:23 - 4 réponses
Posté le 01 mai 2014 - 17:23
Bonjour,

Voila deux jours que je m'arrache les cheveux pour faire fonctionner un lecteur RFID avec Windev ... je jette l'eponge et je m'en remets a vous :merci:

Pour info le lecteur est un Ehuoyan ER301. Il est bien entendu livre avec une sdk et quelques exemples de codes.
J'arrive pour le moment a ouvrir un port, recuperer le numero de version, changer la couleur de la led ou obtenir le S/N du Tag. C'est pas mal ... mais pas assez. Je bloque au niveau de l'authentication de la carte et la lecture des donnees qu'elle contient.

Voici l'exemple fourni en VB :

Dim i, m As Integer
Dim buf1(200) As byte
Dim buf2(200) As byte
Dim s1 As string
Dim b2, b1, b3 As byte
s1 = Trim(tx_key.Text)
IF (Len(s1) <> 12) THEN
lb_info.Text = "Wrong Key Length!"
tx_key.Focus()
Exit Sub
END IF
For i = 0 To 5
buf1(i) = Val("&H" & Mid(s1, i * 2 + 1, 2))
Next i
m = cb_kh.SelectedIndex
IF (m = -1) THEN
lb_info.Text = "Select Block Please!"
Exit Sub
END IF
IF (op_a.Checked) THEN
b1 = &H60s
END IF
IF (op_b.Checked) THEN
b1 = &H61s
END IF
b3 = CByte(m)
'Authentication
i = rf_M1_authentication2(0, b1, b3, buf1(0))
IF (i <> 0) THEN
lb_info.Text = "Authentication Fail£¡"
Exit Sub
END IF


Et ma traduction Wlanguage :

i, m sont des entiers
j est un entier = 0
buf1 est un Buffer sur 200 octets
s1, s2 sont des chaîne
b1, b3 sont des entiers sans signe sur 1 octet

s1 = SansEspace(SAI_KEY)
SI Taille(s1) <> 12 ALORS
Erreur("Wrong Key Length!")
DonneFocus(SAI_KEY)
RETOUR
FIN

POUR i = 1 A 6
s2 = "0x" + Milieu(s1, j * 2 + 1, 2)
buf1[[i]] = s2
FIN

m = COMBO_BLOCK..ValeurAffichée
SI m = -1 ALORS
Erreur("Select Block Please!")
RETOUR
FIN

SELON SEL_KEY..Valeur
CAS "A"
b1 = 0x60
CAS "B"
b1 = 0x61
FIN

b3 = m

//Authentication
i = API("MasterRD.dll","rf_M1_authentication2",0, 1, 1, &buf1)
SI i <> 0 ALORS
Erreur("Authentication Fail!")
RETOUR
FIN


J'ai essaye pas mal de choses mais l'authentication fail a tous les coups ...
Une ame charitable pour me preter main forte ?

Cheers !
Membre enregistré
1 304 messages
Popularité : +47 (51 votes)
Posté le 02 mai 2014 - 11:35
Salut Jonathan,

1ère erreur dans le code suivant:

POUR i = 1 A 6
s2 = "0x" + Milieu(s1, j * 2 + 1, 2)
buf1[[i]] = s2
FIN


Tu utilises j pour remplacer i qui part de 1 au lieu de zéro, mais tu n'incrémente jamais j !

Ensuite dans le code suivant:

m = COMBO_BLOCK..ValeurAffichée
SI m = -1 ALORS
Erreur("Select Block Please!")
RETOUR
FIN


Je ne sais pas ce que tu as dans COMBO_BLOCK comme données, mais pour moi la valeur affichée ne correspond pas à la traduction du code Visual Basic, le test sert pour moi simplement à savoir si une valeur a été sélectionnée, donc tu devrais simplement utiliser COMBO_BLOCK et savoir si la valeur est supérieur à zéro.
De plus, ValeurAffichée renvoi du texte et sauf si les données sont des numériques m contiendra toujours zéro et certainement pas -1

Voici le code revu, essaie le et dis moi si c'est ok

A+
Daryl

//=======================================================
// Pour Info: bufB2 et cB2 ne sont jamais utilisé (A moins que ce soit plus loin dans ton code)
//=======================================================
nI, nM sont des entiers
bufB1 est un Buffer sur 200 octets
bufB2 est un Buffer sur 200 octets
sS1 est une chaîne
cB1, cB2, cB3 sont des caractères

sS1 = SansEspace(SAI_KEY)
SI Taille(sS1) <> 12 ALORS
Erreur("Wrong Key Length")
DonneFocus(SAI_KEY)
RETOUR
FIN

POUR nI = 0 _A_ 5
bufB1[[nI+1]]= Caract(HexaVersEntier(Milieu(sS1, (nI * 2) + 1, 2)))
FIN
nM = COMBO_BLOCK
SI nM <= 0 ALORS
Erreur("Select block Please")
RETOUR
FIN
SELON SEL_KEY
CAS 1
cB1 = Caract(HexaVersEntier("60"))
CAS 2
cB1 = Caract(HexaVersEntier("61"))
FIN

cB3 = Caract(nM)

nI = API("MasterRD.dll","rf_M1_authentication2",0, 1, 1, &bufB1)
SI nI <> 0 ALORS
Erreur("Authentication Failed")
RETOUR
FIN


--
http://www.concept4u2.com
Posté le 27 mars 2017 - 23:16
Bonsoir

Ci joint un bout de code qui devrait aider...

wwResult est une chaîne
wwEntier est un entier
wwSerialNumber est un entier sur 4 octets
wwCpt_Clignote est une entier = 0

wwDeviceID est un entier = 4 // Port COM du lecteur RFID
wwRFIDBaud est un entier = 9600 // Vitesse en bauds
wwKey_A est une chaîne = "FFFFFFFFFFFF" // Clé A

debut_tentative:
wwResult=API("MasterRD.dll", "rf_ClosePort", wwDeviceID)
wwResult=API("MasterRD.dll", "rf_init_com", wwDeviceID,wwRFIDBaud)
wwResult=API("MasterRD.dll", "rf_init_device_number", wwDeviceID)
wwResult=API("MasterRD.dll", "rf_request",wwDeviceID,0x26,&wwEntier)

// Boucle tant que pas de carte RFID présentée
SI wwResult<>"0" ALORS

// Clignotement de la led
wwCpt_Clignote++
SELON wwCpt_Clignote
CAS 1:
wwResult=API("MasterRD.dll", "rf_light",wwDeviceID,2)
CAS 2:
wwResult=API("MasterRD.dll", "rf_light",wwDeviceID,0)
wwCpt_Clignote=0
FIN

Temporisation(50)
GOTO debut_tentative
FIN


wwLength, WwSize est un octet
wwResult=API("MasterRD.dll", "rf_anticoll",wwDeviceID,4,&wwSerialNumber,&wwLength)
wwResult=API("MasterRD.dll", "rf_beep",wwDeviceID,20)
wwResult=API("MasterRD.dll", "rf_light",wwDeviceID,1)
wwResult=API("MasterRD.dll", "rf_select",wwDeviceID,&wwSerialNumber,wwLength,&WwSize)
SI wwResult="0" ALORS

// AFFICHAGE NUMERO DE SERIE
NumCarte est une chaîne
NumCarte=NumériqueVersChaîne(EntierVersHexa(wwSerialNumber))
NumCarte=Milieu(NumCarte,7,2)+Milieu(NumCarte,5,2)+Milieu(NumCarte,3,2)+Milieu(NumCarte,1,2)
Trace("SerialNumber : "+NumCarte)

// LECTURE D'UN BLOCK
Wwblock est un entier = 1

bufB1 est un Buffer sur 200 octets
POUR nI = 0 A 5
bufB1[[nI+1]]= Caract(HexaVersEntier(Milieu(wwKey_A, (nI * 2) + 1, 2)))
FIN

wwResult=API("MasterRD.dll", "rf_M1_authentication2",wwDeviceID,0x60,Wwblock,&bufB1)
Trace("Authentication : "+wwResult)


wwResult=API("MasterRD.dll", "rf_halt",wwDeviceID)
FIN

wwResult=API("MasterRD.dll", "rf_light",wwDeviceID,0)


Etape suivante .... réussir un READ ... puis un WRITE....
Posté le 25 juin 2018 - 12:38
Priere d eme traduire ce code Vb a windev


Dim i, m As Integer
Dim buf1(200) As Byte
Dim buf2(200) As Byte
Dim s1 As String
Dim b2, b1, b3 As Byte
s1 = Trim(tx_key.Text)
If (Len(s1) <> 12) Then
lb_info.Text = "Wrong Key Length!"
tx_key.Focus()
Exit Sub
End If
For i = 0 To 5
buf1(i) = Val("&H" & Mid(s1, i * 2 + 1, 2))
Next i
m = cb_kh.SelectedIndex
If (m = -1) Then
lb_info.Text = "Select Block Please!"
Exit Sub
End If
If (op_a.Checked) Then
b1 = &H60s
End If
If (op_b.Checked) Then
b1 = &H61s
End If
b3 = CByte(m)
'Authentication
i = rf_M1_authentication2(0, b1, b3, buf1(0))
If (i <> 0) Then
lb_info.Text = "Authentication Fail£¡"
Exit Sub
End If
'Read card
i = rf_M1_read(0, b3, buf2(0), b2)
If (i <> 0) Then
lb_info.Text = "Read Card Fail!"
Exit Sub
End If
s1 = ""
For i = 0 To b2 - 1
s1 = s1 & VB.Right("00" & Hex(buf2(i)), 2)
Next i
tx_sj.Text = s1
lb_info.Text = "Read Succeed!"
End Sub
Membre enregistré
1 144 messages
Popularité : +50 (142 votes)
Posté le 25 juin 2018 - 13:30
Bonjour,

Je me suis longtemps casser la tête pour faire fonctionner le lecteur ACR122U. Pour le faire fonctionner avec Windev il a fallut transformer toutes les valeurs Hexa (de la documentation du lecteur) car le poid fort et le poid faible sont inversés dans Windev.
C'est peut-être une piste à examiner.

Thierry