View previous topic :: View next topic |
Author |
Message |
asimraufawan
Joined: 04 Jul 2008 Posts: 12 Location: Karachi Pakistan
|
How to interface magnetic card reader with PC |
Posted: Sat Jul 05, 2008 3:33 am |
|
|
--------------------------------------------------------------------------------
HI ALL!
I am new to this forum.
Actually I want to interface the TTL magnetic card reader with computer
I have tried it with stripe snoop using game port but it does not work out
the reader i m using is TYSSO TTL MCR series which reads data from track 2 with loco magnetic cards, now i m a little bit confused how will i interface it with serial port, in the reader there is a decoder IC ET6106
which decode the magnetic head analog signal to digital form which output three signals which are CARD PRESENT(/CLS) ,DATA(/RDP) & STROBE or CLOCK PULSE (/RCP).
Kindly help me out,
Thanks,
ASIM RAUF |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
|
asimraufawan
Joined: 04 Jul 2008 Posts: 12 Location: Karachi Pakistan
|
|
Posted: Wed Jul 09, 2008 1:45 am |
|
|
I have gone through both the links below plus mcr.c driver
still confused what will be the hardware design. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Jul 09, 2008 11:48 am |
|
|
Just to make sure, do you want to connect the MCR reader to the PC or to a PIC? It's only one letter difference so it could be a typing error.
As I see you posted the same question in at least three other forums not related to the PIC my guess is you intend to read the data with a PC? Please note that this forum is dedicated to the PIC processor and that we don't know a lot about PC interfacing.
Here is a link to a website with several Tysso card readers: http://www.barcode-manufacturer.com/magnetic_card/magstripe.html#OEM_Modules
Which is the one you are using? |
|
|
asimraufawan
Joined: 04 Jul 2008 Posts: 12 Location: Karachi Pakistan
|
|
Posted: Thu Sep 04, 2008 11:19 pm |
|
|
I posted the question on other forums so that i can collect many ideas
now i decided to see the result of card reader on PC by using PIC16F877A.
Simply by connecting the magnetic card reader to PIC then PIC to thePC via RS232.
can any one provide me the sample code. |
|
|
n-squared
Joined: 03 Oct 2006 Posts: 99
|
|
Posted: Fri Sep 05, 2008 8:34 am |
|
|
Did you purchase a CCS compiler? It contains a ready made code for reading tracks 1 and 2. _________________ Every solution has a problem. |
|
|
asimraufawan
Joined: 04 Jul 2008 Posts: 12 Location: Karachi Pakistan
|
|
Posted: Sat Sep 06, 2008 12:13 am |
|
|
Thanks,
i just want to read track 2 data,
this example for reading data from MCR hope will work fine. |
|
|
Ttelmah Guest
|
|
Posted: Sat Sep 06, 2008 2:23 am |
|
|
In terms of hardware, all you need is the normal MAX232 RS232 driver IC (or something else similar), wired just as you would to talk to a PC, _except_ with pins2,and 3 'swapped' on the DB9 connection. Basically the modules are wired to talk to a PC, so the TXD, and RXD connections need to be swapped.
Best Wishes |
|
|
asimraufawan
Joined: 04 Jul 2008 Posts: 12 Location: Karachi Pakistan
|
|
Posted: Fri Sep 12, 2008 12:34 am |
|
|
Quote: |
_except_ with pins2,and 3 'swapped' on the DB9 connection. Basically the modules are wired to talk to a PC, so the TXD, and RXD connections need to be swapped.
|
sorry i didnt get the above point |
|
|
Ttelmah Guest
|
|
Posted: Fri Sep 12, 2008 2:33 am |
|
|
The module is wired so that it's RXD line connects to a PC's TXD line, and vice versa. The normal PIC RS232, is _wired the same way_, so that it too can talk directly to a PC. To talk to the module, you either need a 'null modem' cable (that swaps these lines), or to swap the wiring on the PIC connections.
Best Wishes |
|
|
asimraufawan
Joined: 04 Jul 2008 Posts: 12 Location: Karachi Pakistan
|
|
Posted: Fri Sep 12, 2008 9:41 pm |
|
|
It works fine when i connect first time to the hyper terminal but when i disconnect & then reconnect in the same window it works but show the data twice of each card some time mix the data of different magnetic cards.
Kindly explain the PARITY & LRC error regarding the magnetic cards
as well as where will i find a flow diagram for the whole process.
THANKS |
|
|
asimraufawan
Joined: 04 Jul 2008 Posts: 12 Location: Karachi Pakistan
|
|
Posted: Fri Sep 26, 2008 12:32 am |
|
|
I m just reading the data from track 2 ,therefore i made the mcr.c driver
& example file for the particular task,
Code: |
#include <16F877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#ifndef MCR_CARD_PRESENT
#define MCR_CARD_PRESENT PIN_B0
#define MCR_DATA PIN_B4
#define MCR_STROBE PIN_B5
#endif
#define MCR_ERR_PARITY 2
#define MCR_ERR_LRC 8
int mcr_read(char* track2)
{
int error = 0;
int1 dataBit = 0;
int1 ST = 1;
int1 ST_old = 1;
int1 firstOne = 0;
int1 parity = 0;
int count = 0;
int index = 0;
int LRC = 0;
// Wait for card to be present
while(input(MCR_CARD_PRESENT));
// Loop until a card is not present
while(!input(MCR_CARD_PRESENT))
{
// Check for NULL pointer and an index less than 40
if(track2 != 0 && index < 40)
{
// Get strobe
ST = input(MCR_STROBE);
// If the strobe was high and is now low (falling edge),
//then data is present
if(ST == 0 && ST_old == 1)
{
ST_old = 0;
// Check if the first 1 was received
if(firstOne == 1)
{
// Check if 4 bits of data were received
if(count == 4)
{
// Reset the bit counter back to 0
count = 0;
// Shift the bits right by 4
*(track2+index) >>= 4;
// Verify the LRC
if(*(track2+index-1) == '?' && LRC != *(track2+index))
{
error |= MCR_ERR_LRC;
}
else
{
LRC ^= *(track2+index);
}
// Add 0x30 to convert to ASCII
*(track2+index) += 0x30;
// Check the parity bit. The parity on a 0 is not checked
// because of the trailing zeros after the LRC character
if(!input(MCR_DATA) != parity && *(track2+index) != '0')
{
error |= MCR_ERR_PARITY;
}
// Reset the parity check
parity = 1;
// Increment the index into the array
++index;
}
else
{
// Get a bit of data from the card
dataBit = !input(MCR_DATA);
// XOR the data with the parity bit
parity ^= dataBit;
// Store the new bit of data
shift_right(track2+index, 1, dataBit);
// Increment the bit counter
++count;
}
}
else
{
// Check if the first 1 has appeard on the data line
if(!input(MCR_DATA))
{
// Set the first 1 received flag
firstOne = 1;
// Store the first 1
shift_right(track2, 1, 1);
// Increment the bit counter
++count;
}
}
}
else if(ST == 1)
{
ST_old = 1;
}
}
}
// Return any errors
return error;
}
void main()
{
int index;
int error;
char Track2[40];
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
// TODO: USER CODE!!
while(TRUE)
{
printf("\r\n\nWaiting to read magnetic card...\r\n");
// Read a card and get any errors
error = mcr_read(Track2);
// Display the data in track 2
index=0;
printf("\r\nTrack2 Data:\r\n");
// Loop until the end sentinel (?) is displayed.
// This loop does not display the LRC character.
do
{
//Display the character and increment the index
putc(Track2[index++]);
}
while(Track2[index-1] != '?' && index<40);
// Check for card reading errors
if(error & MCR_ERR_PARITY)
{
printf("\r\nTrack 2 parity error");
}
if(error & MCR_ERR_LRC)
{
printf("\r\nTrack 2 LRC error");
}
}
}
|
In short i m drawing a flow chart for the above program
as for future reference but in function i m not getting how to
describe the flow for LRC & PARITY error verification can any
one explain me in detail.
Below is the part for LRC & PARITY error.
Code: |
{
ST_old = 0;
// Check if the first 1 was received
if(firstOne == 1)
{
// Check if 4 bits of data were received
if(count == 4)
{
// Reset the bit counter back to 0
count = 0;
// Shift the bits right by 4
*(track2+index) >>= 4;
// Verify the LRC
if(*(track2+index-1) == '?' && LRC != *(track2+index))
{
error |= MCR_ERR_LRC;
}
else
{
LRC ^= *(track2+index);
}
// Add 0x30 to convert to ASCII
*(track2+index) += 0x30;
// Check the parity bit. The parity on a 0 is not checked
// because of the trailing zeros after the LRC character
if(!input(MCR_DATA) != parity && *(track2+index) != '0')
{
error |= MCR_ERR_PARITY;
}
// Reset the parity check
parity = 1;
// Increment the index into the array
++index;
}
|
THANKS |
|
|
n-squared
Joined: 03 Oct 2006 Posts: 99
|
|
Posted: Sun Sep 28, 2008 3:59 pm |
|
|
Hi,
The exact description and good explanations for magnetic card reading can be found in the ISO7811 standard.
There should be no problem getting this document on the internet.
Best regards _________________ Every solution has a problem. |
|
|
dsolorzano
Joined: 29 Mar 2011 Posts: 3
|
|
Posted: Tue Mar 29, 2011 1:56 am |
|
|
Hello. The mcr library is very nice. However I need to do a bidirectional code and have been unable to do it. Could anybody help me? Thanks |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Mar 29, 2011 3:12 am |
|
|
Please, for a new question start a new thread. Do not re-open a three year old topic for a question that has almost no relation to the original question. |
|
|
|