Urządzenia peryferyjne
Laboratorium nr 4
Temat: Obsługa czytnika kart magnetycznych.
Prowadzący: dr inż. Tomasz Walkowiak
Elżbieta Tchorowska, 171067
Konrad Kukulski, 163930
Cele ćwiczenia:
Należało wykonać program, który miał za zadanie za pomocą czytnika kart magnetycznych, wypisać na ekran informacje zawarte na karcie lub wypisać wprowadzony na czytniku kod PIN.
Wybranym językiem programowania było C++ , środowisko VisualStudio2008.
Wykonanie:
Pierwszym etapem programu było umożliwienie połączenia się z portem COM1, na którym znajdował się czytnik.
Następnym krokiem było stworzenie interfejsu do obsługi. Znalazły się tam dwa przyciski „Karta” i „Klawiatura”, których zadaniem było przełączanie odczytu między kartą a klawiaturą. Stworzono okienko, w którym miał pokazywać się wynik odczytu oraz przyciski „Odczytaj”, których naciśnięcie oznaczało chęć wyprowadzenia danych na ekran. No i jeszcze okienko na wprowadzanie kodów sterujących.
Kody sterujące były wysyłane do czytnika mniej więcej w sposób :
I tak po wpisaniu kodu „164” gdzieś zaświeciła się zielona diodka, a my do przycisków „Karta” i „Klawiatura” wklepaliśmy wysyłanie kodów wyboru modułu. Po wykonaniu, gdy naciskaliśmy na zmianę te przyciski świecąca diodka zaczęła przeskakiwać z miejsca koło czytnika karty do czytnika PINu i z powrotem.
Następnie należało wykonać wyprowadzanie danych na ekran. Kod był prawie identyczny z tym na górze, z tą różnicą, że zamiast Write było Read, tablica byte była n-elementowa i na końcu kopiowaliśmy do Stringa z wywaleniem go na ekran.
I tu pojawiły się schody. Za pierwszym odczytem nawet działało, za drugim wypisywało bzdury. Prawdopodobnie z powodu nieczyszczenia buforów, których nie zdążyliśmy zrobić.
port = new SerialPort();
timer = new Timer();
port.PortName = "COM1";
port.BaudRate = 2400;
port.Parity = Parity.Odd;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.WriteTimeout = 1000;
port.ReadTimeout = 10000;
port.Encoding = Encoding.UTF8;
timer.Tick += new EventHandler(port_DataReceived);
timer.Interval = 500;
timer.Start();
WriteCmd((byte)170);
WriteCmd((byte)164);
byte[] buf = new byte[2];
buf[0] = (byte)161;
buf[1] = (byte)255;
try
{
if (!port.IsOpen)
port.Open();
port.Write(buf, 0, 2);
port.Close();