本人所使用的RFID读卡器的型号为:MC9500,所用的卡为标准的Mifare One S50,以usb口的方式接入电脑,本人所使用的系统为fedora12.
RFID读卡器内部有一块cp2102的usb转串口的芯片,所以使用的驱动系统的usbserial驱动,在插入设备之前通过
insmod usbserial vendor=.... product=..... ;
insmod cp210x;
命令来加载设备的驱动,cp210x的驱动为系统自带的为cp210x系列usb转串口芯片的驱动程序,在linux2.6.25以上的内核中都自带了,若使用小于2.6.25的内核,可能要手动配备cp210x的驱动,官网上貌似有说明的。vendor ,product这两个参数可以到读卡器配备的window驱动文件中找到,这两个参数是必须的。加载这两个命令后插入RFID读卡器,通过 ls /dev 的命令可以看到多了一个ttyUSB0的设备文件,通过这个设备文件,就可以操作读卡器了。
之后的编程就基本为串口编程了,需要对读卡器进行什么样的操作,就写入什么样的命令即可。可以打电话到厂家索要串口通讯的协议,我的也是打电话后提供的,工作人员的态度还不错。串口编程的时候要注意:发送的数据都是16进制的,读取返回值也要以16进制来进行,而且对字符串操作不能使用string.h下的那几个字符串操作函数,因为写入和读取的数据中间可能有0,而字符串的操作函数都是以'/0'结束的,我就上了这个当。写入数据的时候最后一个字节为效验字,是前面所有字节的异或,这个需要注意一下,否则写入后返回值将全部是0。相关的串口协议和卡的物理结构的说明,在厂家给的文档中会有说明,就不做介绍了。
代码如下,各个公司的RFID读卡器的串口协议不同,但大致的流程是一样,都是串口数据的读写,比较简单:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <locale.h>
#include <wchar.h>
#include"fc.h" //fc.h头文件只是将下面的某几个函数申明了一下,用不用大致都行的。
static unsigned char Device[]={0x9b,0x0e,0x00,0x1a,0x40,0x52,0x46,0x20,0x43,0x61,0x72,0x64,0x52,0x65,0x61,
0x64,0x65,0x72,0x20,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x31,0x2e,0x30,0x9f,0x00};
static unsigned char Card[]={0x9B,0x05,0x00,0x09,0x30,0x00,0x08};
static unsigned char Auth[]={0x9b,0x0c,0x00,0x02,0x31,0x00,0xa4};
int fd;
pthread_mutex_t psemread= PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t psemstrcpy= PTHREAD_MUTEX_INITIALIZER;
char lpOutBuffer[30];
unsigned char lpReadbuf[50];
int set_opt()
{
struct termios newtio,oldtio;
if ( tcgetattr( fd,&oldtio) != 0) {
perror("SetupSerial 1");
return -1;
}
bzero( &newtio, sizeof( new