cpp文件
#include "cardreader.h"
Cardreader::Cardreader()
{
}
int Cardreader::open_port(int comport)
{
/* 打开端口 成功返回文件描述符 失败返回0*/
/*open COM Port*/
/* comport=1 open COM1 comport=2 open COM2 comport=3 open COM3*/
//char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2"};
long vdisable;
int fd;
if (comport==1)
{ fd = open( "/dev/ttySAC0", O_RDWR|O_NOCTTY|O_NDELAY);
if (0 == fd)
{
emit message("Open port error 1");
return(0);
}
}
else if(comport==2)
{ fd = open( "/dev/ttySAC1", O_RDWR|O_NOCTTY|O_NDELAY);
if (0 == fd)
{
emit message("Open port error 1");
return(0);
}
}
else if (comport==3)
{
fd = open( "/dev/ttySAC2", O_RDWR|O_NOCTTY|O_NDELAY);
if (0 == fd)
{
emit message("Open port error 1");
return(0);
}
}
if(fcntl(fd, F_SETFL, 0)<0)
{
emit message("Open port error 2");
return(0);
}
if(isatty(STDIN_FILENO)==0)
{
emit message("Open port error 3");
// return(0);
}
return fd;
}
int Cardreader::set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
/* 端口设置,成功返回1,失败返回0 */
/*set patmeter of COM port*/
/*fd:file descript of COM port
nSpeed:baut rate
nBits:unmber of data bits
nEven:PARE mode O:odd E:even N:none
nStop:stop bits*/
struct termios newtio,oldtio;
if ( tcgetattr( fd,&oldtio) != 0)
return 0;
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
switch( nBits )
{
case 7:
newtio.c_cflag |= CS7;//7 bits data
break;
case 8:
newtio.c_cflag |= CS8;//8 bits data
break;
}
switch( nEvent )
{
case 'O'://odd
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E': //even
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N': //none
newtio.c_cflag &= ~PARENB;
break;
}
switch( nSpeed )
{
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 91000:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 571000:
cfsetispeed(&newtio, B57600);
cfsetospeed(&newtio, B57600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if( nStop == 1 )
newtio.c_cflag &= ~CSTOPB;
else if ( nStop == 2 )
newtio.c_cflag |= CSTOPB;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
return 0;
return 1;
}
int Cardreader::initcardreader(int fd_port)
{
/* 读卡器初始化,成功返回1,失败返回0 */
unsigned char buffer[32];
int readnum;
unsigned int timer;
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
//发送开始符 0x20
buffer[0]=0x20;
write(fd_port,buffer,1);
//等待0x06回应 否则出错退出
usleep(40*1000);//等待40ms
timer=0;
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if (buffer[0]!=0x06)
return 0;
//发送 0x00 0x52 0x00 0xad 0x03
//usleep(40*1000);//等待40ms
buffer[0]=0x00;buffer[1]=0x52;buffer[2]=0x00;buffer[3]=0xad;buffer[4]=0x03;
write(fd_port,buffer,5);
//等待0x20回应 否则出错退出
usleep(40*1000);//等待50ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1500)//等待超时则退出
return 0;
} while (readnum==0);
if (buffer[0]!=0x20)
return 0;
//发送0x06
buffer[0]=0x06;
write(fd_port,buffer,1);
//等待0x00 0x00 0x00 0xff 0x03回应 否则出错退出
usleep(40*1000);//等待40ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x00)||(buffer[3]!=0xff)||(buffer[4]!=0x03))
return 0;
//发送开始符 0x20
buffer[0]=0x20;
write(fd_port,buffer,1);
//等待0x06回应 否则出错退出
usleep(40*1000);//等待40ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if (buffer[0]!=0x06)
return 0;
//发送 00 4c 08 00 00 ff ff ff ff ff ff bb 03
buffer[0]=0x00;buffer[1]=0x4c;buffer[2]=0x08;buffer[3]=0x00;buffer[4]=0x00;buffer[5]=0xff;buffer[6]=0xff;
buffer[7]=0xff;buffer[8]=0xff;buffer[9]=0xff;buffer[10]=0xff;buffer[11]=0xbb;buffer[12]=0x03;
write(fd_port,buffer,13);
//等待0x20回应 否则出错退出
usleep(40*1000);//等待40ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if (buffer[0]!=0x20)
return 0;
//发送0x06
buffer[0]=0x06;
write(fd_port,buffer,1);
//等待0x00 0x00 0x00 0xff 0x03回应 否则出错退出
usleep(40*1000);//等待40ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x00)||(buffer[3]!=0xff)||(buffer[4]!=0x03))
return 0;
return 1;
}
unsigned int Cardreader::checkcard(int fd_port)
{
/* 检查天线范围内有无卡,有返回1,无或失败返回0 */
unsigned char buffer[32];
int readnum;
unsigned int timer;
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
//发送开始符 0x20
buffer[0]=0x20;
write(fd_port,buffer,1);
//等待0x06回应 否则出错退出
usleep(40*1000);//等待40ms
timer=0;
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
{ //emit message("card found error 1");
return 0;
}
} while (readnum==0);
if (buffer[0]!=0x06)
{
emit message("card found error 2");
return 0;
}
//发送 00 41 01 01 be 03
buffer[0]=0x00;buffer[1]=0x41;buffer[2]=0x01;buffer[3]=0x01;buffer[4]=0xbe;buffer[5]=0x03;
write(fd_port,buffer,6);
//等待0x20回应 否则出错退出
usleep(40*1000);//等待50ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if (buffer[0]!=0x20)
{
emit message("card found error 3");
return 0;
}
//发送0x06
buffer[0]=0x06;
write(fd_port,buffer,1);
//等待0x00 0x00 0x02 0x04 0x00 0xf9 0x03回应
usleep(50*1000);//等待40ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
{
emit message("card found error 4");
return 0;
}
} while (readnum==0);
if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x02)||(buffer[3]!=0x04)||(buffer[4]!=0x00)||(buffer[5]!=0xf9)||(buffer[6]!=0x03))
{
//emit message("card found error 5");
return 0;
}
return 1;
}
unsigned int Cardreader::readcardid (int fd_port)
{
/* 读取卡id号码,成功返回32位整数,无或失败返回0 */
unsigned char buffer[32];
int readnum;
unsigned int timer;
unsigned int result;
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
//发送开始符 0x20
buffer[0]=0x20;
write(fd_port,buffer,1);
//等待0x06回应 否则出错退出
usleep(40*1000);//等待40ms
timer=0;
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if (buffer[0]!=0x06)
return 0;
//发送 00 71 02 00 00 8c 03
buffer[0]=0x00;buffer[1]=0x71;buffer[2]=0x02;buffer[3]=0x00;buffer[4]=0x00;buffer[5]=0x8c;buffer[6]=0x03;
write(fd_port,buffer,7);
//等待0x20回应 否则出错退出
usleep(40*1000);//等待50ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if (buffer[0]!=0x20)
return 0;
//发送0x06
buffer[0]=0x06;
write(fd_port,buffer,1);
//等待0x00 0x00 0x04 0x04 .... 0x03回应
usleep(40*1000);//等待40ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x04)||(buffer[8]!=0x03))
return 0;
result=0;
result=buffer[3];
result+=buffer[4]<<8;
result+=buffer[5]<<16;
result+=buffer[6]<<24;
return result;
}
int Cardreader::beep(int fd_port)
{
/* 蜂鸣器响,成功返回32位整数,无或失败返回0 */
unsigned char buffer[32];
int readnum;
unsigned int timer;
unsigned int result;
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
//发送开始符 0x20
buffer[0]=0x20;
write(fd_port,buffer,1);
//等待0x06回应 否则出错退出
usleep(40*1000);//等待40ms
timer=0;
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if (buffer[0]!=0x06)
return 0;
//发送 00 60 04 0a 19 19 01 90 03
buffer[0]=0x00;buffer[1]=0x60;buffer[2]=0x04;buffer[3]=0x0a;buffer[4]=0x19;buffer[5]=0x19;buffer[6]=0x01;buffer[7]=0x90;buffer[8]=0x03;
write(fd_port,buffer,9);
//等待0x20回应 否则出错退出
usleep(40*1000);//等待50ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if (buffer[0]!=0x20)
return 0;
//发送0x06
buffer[0]=0x06;
write(fd_port,buffer,1);
//等待0x00 0x00 0x00 0xff 0x03回应
usleep(40*1000);//等待40ms
memset(buffer,0,sizeof(buffer));//buffer 缓冲区清0
timer=0;
do
{
readnum=read(fd_port,buffer,sizeof(buffer));
usleep(100);
timer++;
if (timer>1000)//等待超时则退出
return 0;
} while (readnum==0);
if ((buffer[0]!=0x00)||(buffer[1]!=0x00)||(buffer[2]!=0x00)||(buffer[3]!=0xff)||(buffer[4]!=0x03))
return 0;
return 1;
}
void Cardreader::autorun()
{
int newid,oldid;
fd_port=open_port(1);
set_opt(fd_port,57600, 8, 'N', 1);
initcardreader(fd_port);
for (int i=0;i<20;i++)
{
usleep(200*1000);
if (checkcard(fd_port))
{
newid=readcardid(fd_port);
if (oldid!=newid)
{
sendmessage(newid);
oldid=newid;
beep(fd_port);
}
}
}
}
void Cardreader::sendmessage(int data)
{
emit message(QString::number(data,16));
}