10
10
#define PRES 5
11
11
12
12
// création d'un objet Software Serial
13
- SoftwareSerial serialCard (RX, TX);
13
+ SoftwareSerial serialCard (RX, TX, false );
14
+
14
15
15
16
// Variable de détection de la présence de la carte
16
17
bool isntCardPresente = digitalRead(PRES); // carte présente = 0 & carte absente = 1
17
18
18
19
20
+ String transmitAPDU_T0 (String apdu) {
21
+
22
+ String sub;
23
+ char buf[3 ];
24
+
25
+ serialCard.stopListening ();
26
+
27
+ for (int i = 0 ; i < apdu.length ()+1 ; i += 2 ){
28
+ sub = apdu.substring (i, i+2 );
29
+ sub.toCharArray (buf, 3 );
30
+ byte b = (byte)strtol (buf, 0 , 16 );
31
+ serialCard.write (b);
32
+ }
33
+ serialCard.listen ();
34
+ String response1 = read_response ();
35
+
36
+ return response1;
37
+
38
+
39
+ }
40
+
41
+
42
+
19
43
20
44
String read_response () {
21
45
String result = " " ;
@@ -28,32 +52,40 @@ String read_response() {
28
52
byte c = serialCard.read ();
29
53
if (c < 0x10 ) result += ' 0' ;
30
54
result += String (c, HEX) + ' ' ;
31
- // Serial.println(String(c));
32
55
}
33
56
}
34
57
35
- // pinMode(RX , OUTPUT);
36
- if (result.length () < 2 )
58
+ // pinMode(TX , OUTPUT);
59
+ if (result.length () < 2 ) {
37
60
Serial.println (" No responses." );
61
+ }
62
+
38
63
return result;
39
64
40
65
}
41
66
42
67
68
+
69
+
43
70
void card_activate () {
44
71
digitalWrite (VCC, HIGH);
45
72
pinMode (CLK, OUTPUT);
73
+ pinMode (RX, INPUT_PULLUP);
74
+ pinMode (TX, INPUT_PULLUP);
46
75
delay (1 );
47
76
digitalWrite (RST, HIGH);
77
+ serialCard.stopListening ();
48
78
serialCard.listen ();
49
79
while (!serialCard.isListening ());
80
+ Serial.println (" Card Activate" );
50
81
}
51
82
52
83
void card_desactivate () {
53
84
digitalWrite (VCC, LOW);
54
85
digitalWrite (RST, LOW);
55
86
pinMode (CLK, INPUT);
56
87
serialCard.stopListening ();
88
+
57
89
58
90
}
59
91
@@ -74,11 +106,15 @@ void setup() {
74
106
pinMode (PRES, INPUT_PULLUP);
75
107
pinMode (VCC, OUTPUT);
76
108
pinMode (RST, OUTPUT);
109
+ digitalWrite (VCC, LOW);
110
+ digitalWrite (RST, LOW);
77
111
78
112
// Ouverture liaisons séries
79
113
Serial.begin (9600 );
80
114
while (!Serial);
81
115
serialCard.begin (10753 );
116
+ while (!serialCard);
117
+
82
118
Serial.println (" Prêt" );
83
119
84
120
@@ -96,12 +132,50 @@ void loop() {
96
132
};
97
133
98
134
// on sort de la boucle donc une carte est présente
99
- Serial.println (" Carte présente" );
100
- if (serialCard.overflow ()) {
101
- Serial.println (" portOne overflow!" );
102
- }
135
+ // Serial.println("Carte présente");
136
+ // if (serialCard.overflow()) {
137
+ // Serial.println("portOne overflow!");
138
+ // }
139
+ // delay(1000);
140
+ // card_desactivate();
141
+ // delay(1000);
103
142
card_activate ();
104
- Serial.print (read_response ());
143
+
144
+
145
+ String ATR = read_response ();
146
+ Serial.println (" ATR = " + ATR);
147
+
148
+ String _atr = ATR;
149
+ _atr.replace (" " ," " );
150
+ Serial.println (" _atr = " + _atr);
151
+ String ts = _atr.substring (0 , 2 );
152
+ String t0 = _atr.substring (2 , 4 );
153
+ String ta1 = _atr.substring (4 , 6 );
154
+ Serial.println (" ts = " + ts);
155
+ Serial.println (" t0 = " + t0);
156
+ Serial.println (" ta1 = " + ta1);
157
+
158
+ // convertion en binaire
159
+ byte buffer[t0.length ()+1 ];
160
+ t0.toCharArray (buffer, t0.length ()+1 );
161
+ byte _t0 = (byte)strtol (buffer, 0 , 16 );
162
+ Serial.println (_t0, BIN);
163
+
164
+ // TA1 exist ?
165
+ if ((_t0 & 0x80 )) {
166
+ Serial.println (" Présence de TA1" );
167
+ }
168
+
169
+ /*
170
+ serialCard.begin(125000);
171
+ String GO_TO_DF = "00 A4 04 0C 06 FF 54 41 43";
172
+ String EF_ICC = "00 02";
173
+ String mess_apdu = GO_TO_DF + " " + EF_ICC ;
174
+ //mess_apdu = mess_apdu.replace(" ","");
175
+ Serial.println(mess_apdu);
176
+ String result = "";
177
+ result = transmitAPDU_T0(mess_apdu);
178
+ */
105
179
106
180
while (!isntCardPresente) {
107
181
isntCardPresente = digitalRead (PRES);
0 commit comments