Bogusław Kempny

Czytnik kart zbliżeniowych RFID RDM630

Autor adres
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 RFID Grafolog ....











Po każdym odczycie karty czytnik wysyła na port szeregowy:

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