Buongiorno a tutti,
è la prima volta che mi interfaccio con un lettore di carte magnetiche. Sono riuscito senza alcun problema a connetterlo ad arduino e a farlo comunicare tramite seriale (Essendo un lettore con RS232 a 9600bpi a 8 bit). Tramite un semplice Serial.read() riesco a leggere i valori in decimale (oppure in esagesimale con (Serial.read(),HEX)) ma non riesco a trovare una corrispondenza tra il valore in decimale e la lettera che dovrei avere. Nel dettaglio sto cercando di leggere la banda magnetica del mio codice fiscale. Qualcuno mi sa dire come posso risolvere il problema?
Buongiorno,
essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.
Guglielmo
Spero bene che tu NON abbia collegato la porta RS232 (+12V / -12V) ad Arduino (TTL 0 / +5V) senza un adattatore di livelli ...
... come hai fatto le connessioni ?
Guglielmo
P.S.: Comunque immagino che usi la codifica ASCII
Ovviamente sarebbe da folli fare una cosa del genere...Per fortuna non lo sono ancora...cmq il problema è di pura decodifica non di connessione (oltre al fatto che se avessi fatto l'errore da te scritto non solo non avrei letto nulla, ma ad oggi mi starei rimpiangendo un arduino). Non so decodificare i valori che ricevo in decimali a caratteri perchè pur usando la tabella ASCII sembra non esistere alcuna corrispondenza tra i valori letti e le presunte corrispettive lettere.
... bene ... almeno un dubbio ce lo siamo levati
QUESTO sembrerebbe essere il sito con le specifiche del prodotto e sulla pagina c'è il link al datasheet della versione RS232 con le specifiche di protocollo (perché sembra che accetti dei comandi ed abbia un suo protocollo) ... prova a dare un'occhiata ... :
Guglielmo
Ho già trovato anche il sito delle specifiche e nelle specifice di protocollo dice che la comunicazione è a 9600bps, 8bit senza parità stop bit: 1 bit e startup bit: 1bit. Arduino di default ha una comunicazione a 9600bps(da me impostata) a 8 bit senza parità e a stop bit 1. Non ho idea di come impostare lo startup bit e non trovo niente in rete, e non ho neanche idea se il mio problema sia relativo a questo.
Per "il tuo codice fiscale" presumo tu intenda quello su una banda magnetica di una tessera tipo carta dei servizi o simile ... ma su quale traccia stai leggendolo ? ...
Perche' su quelle bande magnetiche non c'e' solo una traccia, e non c'e' di sicuro solo il codice fiscale ... ad esempio, sulla "carta nazionale dei servizi", ci sono 3 tracce utilizzabili, sulla prima c'e' registrato il codice "start sentinel" (ASCII 1000101), codice fiscale (16 caratteri) ed il cognome e nome (60 caratteri, cognome separato dal nome da due spazi), "end sentinel" (ASCII 0011111),ed il terminatore LCR con il suo bit di parita', il tutto in standard IATA (codifica alfanumerica a 6 bit ASCII con 1 bit di parità, registrazione AIKEN con densita' 210bpi ...
Sulla seconda, lo stesso codice fiscale della prima, pero' sono 32 caratteri in codifica ABA (codifica numerica a 4 bit BCD con 1 bit di parità), preceduto da "start sentinel" (BCD 01011) e seguito da "end sentinel" (BCD 11111), oppure l'ID della tessera (20 cifre) al posto del codice fiscale (e' a discrezione dell'ente emittente decidere quale delle due cose registrarci), stessi sentinel, e chiusura LRC con il bit di parita', pero' in codifica AIKEM a 75 bpi ... inoltre, le cifre NON corrispondono alla codifica standard ASCII, ma partono da 00=0, 01=1 ... 11=A, 12=B ... fino a 32=Z ...
La terza traccia e' a discrezione dell'Anonima Estorsioni (AE), che anche se non si capisce che cribbio c'entri con il SSN, ha le zampacce pure li ...
Altre carte potrebbero avere anche la quarta traccia utilizzata, ed usare diversi standard e diverse codifiche di scrittura (alla faccia della standardizzazione, ovviamente)
Tempesta813:
Ho già trovato anche il sito delle specifiche e nelle specifice di protocollo dice che la comunicazione è a 9600bps, 8bit senza parità stop bit: 1 bit e startup bit: 1bit.
NO, quello NON è il "protocollo" quelle sono le "specifiche della trasmissione seriale" come descritto nella sezione 5 del documento indicato.
Per "protocollo" si intende quanto descritto nelle sezioni 6 e 7 ... protocollo con cui "comandi" il lettore e "leggi" le risposte nel formato li spiegato !
Guglielmo
MTK-R1300 Specification-RS232.pdf (369 KB)
Buongiorno, so che quello non è il protocollo, ma nel datasheet del lettore magnetico non da alcuna informazione che a me serve.
Per quanto riguarda il codice fiscale sarebbe la tessera sanitaria composta da codice fiscale + cognome e nome + numero di identificazione. Cmq al di la di tutto io faccio un semplice Serial.read(). Cmq visto che a quanto pare si tratta di utilizzare uno standard, esiste per caso una libreria che già fa questo lavoro? O devo decodificare codice per codice?
Vi posto i valori che ottengo, il corrispettico valore in binario e il carattere che dovrei ottenere.
6D 109 01101101 %
AE 174 10101110 F
AB 171 10101011 R
56 86 01010110 M
56 86 01010110 M
55 85 01010101 S
3D 61 00111101 M
99 153 10011001 8
67 103 01100111 3
9B 155 10011011 L
8F 143 10001111 2
79 121 01111001 8
97 151 10010111 C
8D 141 10001101 4
95 149 10010101 9
6D 109 01101101 5
73 115 01110011 I
61 97 01100001 F
5B 91 01011011 O
65 101 01100101 R
6D 109 01101101 M
59 89 01011001 I
7D 125 01111101 S
63 99 01100011 A
61 97 01100001 N
BF 191 10111111 O
BF 191 10111111
65 101 01100101 M
7D 125 01111101 A
59 89 01011001 S
59 89 01011001 S
6D 109 01101101 I
65 101 01100101 M
61 97 01100001 O
81 129 10000001 ?
89 137 10001001 ;
8F 143 10001111 8
9F 159 10011111 0
99 153 10011001 3
8F 143 10001111 8
9F 159 10011111 0
9F 159 10011111 0
9F 159 10011111 0
9D 157 10011101 1
95 149 10010101 5
9F 159 10011111 0
95 149 10010101 5
9F 159 10011111 0
9F 159 10011111 0
8F 143 10001111 8
97 151 10010111 4
8D 141 10001101 9
8D 141 10001101 9
9F 159 10011111 0
99 153 10011001 3
93 147 10010011 6
81 129 10000001 ?
9D 157 10011101 1
E5 229 11100101
0 0 00000000
Nella prima colonna ci sono i valori in HEX, nella seconda i valori in DEC nella terza i valori in BIN e nella quarta la lettura che dovrei ottenere con il lettore utilizzato (sono riuscito a ricavarlo utilizzando un software della casa madre).