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);
}
English