Po każdym odczycie karty czytnik wysyła na port szeregowy:
- bajt 02, jako znacznik początku transmisji
- 10 bajtów ID karty
- bajt CRC (XOR z bajtów ID karty, tych 5 zapisanych na karcie)
- bajt 03, jako znacznik końca transmisji
Bajty ID wysyłane sa w postaci kodów ASCII, więc na przykład bajt 7A wysłany zostanie jako dwa znaki, 37H (szesnastkowo) i 41H, stąd 10 znaków zamiast 5.
No to zaczynamy: Właściwy fragment programu do odczytu kart zaczyna się tu:
W niekończącej się pętli czytamy dane z portu szeregowego.
for(;;) {Dwie poniższe linijki kodu wymagają wyjaśnienia. Kiedy transponder znajdzie się w polu elektromagnetycznym anteny, czytnik wysyła kilka jej odczytów.
Nie wiem dlaczego, czasami 3, czasami 7, kolejne odczyty transpondera wysyłane są dopiero jak transponder usuniemy i zbliżymy ponownie.
Dlatego po każdym odczycie odczekujemy sekundę , po czym czytamy wszystkie bajty które są w buforze UART. W ten sposób pozbywamy się wielokrotnych odczytów karty.
// remove multiple card readings sleep(1); while( read(pd, &znak, 99) > 0) ;Teraz czekamy na bajt 02H, start transmisji:
znak[0]=0x00; while (znak[0] != 0x02) // start of card ID { read(pd, &znak[0], 1); } n=0;Czytamy 11 kolejnych bajtów, czyli kody ASCII ID karty i CRC. Bajt końca transmisji, 03H ignorujemy, zostanie usunięty mechanizmem opisanym wyżej.
for(;;) { if ((a=read (pd, &znak, 1)) != -1) { karta[n] = znak[0]; n++; if (n>11) break; } }Nie sprawdzamy CRC, praktyka uczy, że przekłamania są bardzo rzadkie, a w praktyce nasz program i tak będzie sprawdzał ID karty w bazie danych, żeby ustalić na przykład uprawnienia właściciela.
W miejsce bajtu CRC wpisujemy bajt 00H, znacznik końca łańcucha w języku C:
// remove CRC karta[10]=0x00;No i coś teraz z odczytanym ID musimy zrobić, sprawdzić w bazie danych, zapisać do pliku... W naszym przykładowym programie po prostu go wyświetlimy:
printf("karta: %s\n", karta); fflush(0); }