1
+ #include < SoftwareSerial_hm.h>
2
+
1
3
#include < Arduino.h>
2
- # include < SoftwareSerial.h >
4
+
3
5
4
6
5
7
#define VCC 13
9
11
#define TX 3
10
12
#define PRES 5
11
13
14
+ // Variables
15
+ byte TS, T0, TA1, TB1, TC1, TD1, K;
16
+ byte TA2, TB2, TC2, TD2;
17
+ byte TA3, TB3, TC3, TD3 ;
18
+ byte TCK, T ;
19
+ String historicals_caracters;
20
+
21
+ bool isntCardPresente = digitalRead(PRES); // Variable de détection de la présence de la carte : carte présente = 0 & carte absente = 1
22
+
23
+
24
+
12
25
// création d'un objet Software Serial
13
- SoftwareSerial serialCard (RX, TX, false );
26
+ SoftwareSerial_hm serialCard (RX, TX, false );
14
27
15
28
16
- // Variable de détection de la présence de la carte
17
- bool isntCardPresente = digitalRead(PRES); // carte présente = 0 & carte absente = 1
29
+ void analyse_atr (String ATR) {
30
+ String _atr = ATR;
31
+ _atr.replace (" " ," " );
32
+ Serial.println (" _atr = " + _atr);
33
+ TS = stringToByte (_atr.substring (0 , 2 )); // [0, 2[
34
+ T0 = stringToByte (_atr.substring (2 , 4 )); // [2, 4[
35
+
36
+ // i représente la position des caractères dans l'ATR, commence à 4 juste après le caractère T0, chaque caractère est sur 2i soit 8bits
37
+ // il servira à déterminer la position des caractères facultatif de l'ATR
38
+ int i = 4 ;
39
+
40
+ // Analyse T0
41
+ // détermination de K, nb de caratères d'historique de l'ATR
42
+ K = T0 & 0x0F ;
43
+
44
+ // Présence de TA1 : sur le bit 4
45
+ if ((T0 & 0x10 )) {
46
+ TA1 = stringToByte (_atr.substring (i, i+2 ));
47
+ i += 2 ; }
48
+ // Peésence de TB1 sur le bit 5
49
+ if ((T0 & 0x20 )) {
50
+ TB1 = stringToByte (_atr.substring (i, i+2 ));
51
+ i += 2 ; }
52
+ // Peésence de TC1 sur le bit 6
53
+ if ((T0 & 0x40 )) {
54
+ TC1 = stringToByte (_atr.substring (i, i+2 ));
55
+ i += 2 ; }
56
+ // Peésence de TD1 sur le bit 7
57
+ if ((T0 & 0x80 )) {
58
+ TD1 = stringToByte (_atr.substring (i, i+2 ));
59
+ i += 2 ; }
60
+
61
+ // Caractères Tx2
62
+ if ((TD1 & 0xF0 )) { // présence d'un bit 1 sur l'un des bits 4 à 7 alors présence de caractère Tx2
63
+ // Présence de TA1 : sur le bit 4
64
+ if ((TD1 & 0x10 )) {
65
+ TA2 = stringToByte (_atr.substring (i, i+2 ));
66
+ i += 2 ; }
67
+ // Peésence de TB1 sur le bit 5
68
+ if ((TD1 & 0x20 )) {
69
+ TB2 = stringToByte (_atr.substring (i, i+2 ));
70
+ i += 2 ; }
71
+ // Peésence de TC1 sur le bit 6
72
+ if ((TD1 & 0x40 )) {
73
+ TC2 = stringToByte (_atr.substring (i, i+2 ));
74
+ i += 2 ; }
75
+ // Peésence de TD1 sur le bit 7
76
+ if ((TD1 & 0x80 )) {
77
+ TD2 = stringToByte (_atr.substring (i, i+2 ));
78
+ i += 2 ;}
79
+ }
18
80
81
+ // Caractères Tx3
82
+ if ((TD2 & 0xF0 )) { // présence d'un bit 1 sur l'un des bits 4 à 7 alors présence de caractère Tx2
83
+ // Présence de TA1 : sur le bit 4
84
+ if ((TD2 & 0x10 )) {
85
+ TA3 = stringToByte (_atr.substring (i, i+2 ));
86
+ i += 2 ; }
87
+ // Peésence de TB1 sur le bit 5
88
+ if ((TD2 & 0x20 )) {
89
+ TB3 = stringToByte (_atr.substring (i, i+2 ));
90
+ i += 2 ; }
91
+ // Peésence de TC1 sur le bit 6
92
+ if ((TD2 & 0x40 )) {
93
+ TC3 = stringToByte (_atr.substring (i, i+2 ));
94
+ i += 2 ; }
95
+ // Peésence de TD1 sur le bit 7
96
+ if ((TD2 & 0x80 )) {
97
+ TD3 = stringToByte (_atr.substring (i, i+2 ));
98
+ i += 2 ;}
99
+ }
100
+
101
+ // Caractères historiques
102
+ historicals_caracters = _atr.substring (i, i+(K*2 ));
103
+ i = i+(K*2 );
104
+
105
+ // Caractères TCK
106
+ TCK = stringToByte (_atr.substring (i, i+2 ));
19
107
20
- String transmitAPDU_T0 (String apdu) {
108
+ // Protocole T
109
+ T = TD1 & 0x0F ;
110
+
111
+
112
+
113
+
114
+
115
+
116
+ }
21
117
118
+ byte stringToByte (String stb) {
22
119
String sub;
23
120
char buf[3 ];
121
+ stb.toCharArray (buf, 3 );
122
+ byte b = (byte)strtol (buf,0 ,16 );
123
+ return b;
124
+ }
24
125
25
- serialCard.stopListening ();
126
+ String transmitAPDU_T0 (String apdu) {
127
+
128
+ String sub;
129
+ char buf[2 ];
26
130
131
+ pinMode (TX, OUTPUT);
132
+ serialCard.stopListening ();
27
133
for (int i = 0 ; i < apdu.length ()+1 ; i += 2 ){
28
- sub = apdu.substring (i, i+2 );
29
- sub.toCharArray (buf, 3 );
134
+ sub = apdu.substring (i, i+1 );
135
+ sub.toCharArray (buf, 2 );
30
136
byte b = (byte)strtol (buf, 0 , 16 );
31
- serialCard.write (b);
137
+ serialCard.write_8E2 (b);
138
+
32
139
}
33
- serialCard.listen ();
140
+ // serialCard.listen();
34
141
String response1 = read_response ();
35
142
36
143
return response1;
@@ -45,6 +152,7 @@ String read_response() {
45
152
String result = " " ;
46
153
47
154
pinMode (TX, INPUT_PULLUP); // Prevent signal collision.
155
+ serialCard.listen ();
48
156
unsigned long first = millis ();
49
157
while (millis () - first < 100 ){ // If there's no incoming data for 100ms. Break.
50
158
if (serialCard.available ()){
@@ -55,7 +163,6 @@ String read_response() {
55
163
}
56
164
}
57
165
58
- // pinMode(TX, OUTPUT);
59
166
if (result.length () < 2 ) {
60
167
Serial.println (" No responses." );
61
168
}
@@ -96,8 +203,6 @@ void card_desactivate() {
96
203
97
204
void setup () {
98
205
// Clock 4MHz
99
- // pinMode(TX, OUTPUT);
100
- // pinMode(CLK, OUTPUT);
101
206
TCCR2A = _BV (COM2A0) | _BV (COM2B1) | _BV (WGM21) | _BV (WGM20);
102
207
TCCR2B = _BV (WGM22) | _BV (CS20);
103
208
OCR2A = 1 ;
@@ -131,51 +236,58 @@ void loop() {
131
236
132
237
};
133
238
134
- // on sort de la boucle donc une carte est présente
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);
142
- card_activate ();
143
239
240
+ card_activate ();
144
241
242
+ // récup de l'ATR
145
243
String ATR = read_response ();
146
244
Serial.println (" ATR = " + ATR);
147
245
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
- }
246
+ // Analyse de l'ATR
247
+ analyse_atr (ATR);
248
+ Serial.print (" TS = " );
249
+ Serial.println (TS, HEX);
250
+ Serial.print (" T0 = " );
251
+ Serial.println (T0, HEX);
252
+ Serial.print (" Nb de caractères d'historique K : " );
253
+ Serial.println (K, DEC);
254
+ Serial.println (K);
255
+ Serial.print (" TA1 = " );
256
+ Serial.println (TA1, HEX);
257
+ Serial.println (TA1, BIN);
258
+ Serial.print (" TB1 = " );
259
+ Serial.println (TB1, HEX);
260
+ Serial.print (" TC1 = " );
261
+ Serial.println (TC1, HEX);
262
+ Serial.print (" TD1 = " );
263
+ Serial.println (TD1, HEX);
264
+ if ((TA2 & 0xFF )) {Serial.print (" TA2 = " );Serial.println (TA2, HEX);};
265
+ if ((TB2 & 0xFF )) {Serial.print (" TB2 = " );Serial.println (TB2, HEX);};
266
+ if ((TC2 & 0xFF )) {Serial.print (" TC2 = " );Serial.println (TC2, HEX);};
267
+ if ((TD2 & 0xFF )) {Serial.print (" TD2 = " );Serial.println (TD2, HEX);};
268
+ if ((TA3 & 0xFF )) {Serial.print (" TA3 = " );Serial.println (TA3, HEX);};
269
+ if ((TB3 & 0xFF )) {Serial.print (" TB3 = " );Serial.println (TB3, HEX);};
270
+ if ((TC3 & 0xFF )) {Serial.print (" TC3 = " );Serial.println (TC3, HEX);};
271
+ if ((TD3 & 0xFF )) {Serial.print (" TD3 = " );Serial.println (TD3, HEX);};
272
+ Serial.print (" Caractères historiques = " );
273
+ Serial.println (historicals_caracters);
274
+ Serial.print (" TCK = " );
275
+ Serial.println (TCK, HEX);
276
+ Serial.print (" Protocole T = " );
277
+ Serial.println (T, DEC);
278
+
279
+ // Envoi première commande
280
+ // String First_Com = "00A4040C020520";
281
+ String First_Com = " 00A40000023F00" ;
282
+ String First_response = transmitAPDU_T0 (First_Com);
283
+ Serial.println (First_response);
284
+
285
+ Serial.println (F_CPU);
286
+ uint16_t bit_delay = (F_CPU / 10753 ) / 4 ;
287
+ Serial.println (bit_delay);
288
+ uint16_t _tx_delay = bit_delay - 15 /4 ;
289
+ Serial.println (_tx_delay);
168
290
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
- */
179
291
180
292
while (!isntCardPresente) {
181
293
isntCardPresente = digitalRead (PRES);
0 commit comments