资源描述
一个在linux下的串口程序例子用于mini2440与周立功非接触式ic卡模块的通信头文件#include #include #include #include #include #include #include #include #include #include #include class Cardreader : public QThreadQ_OBJECTpublic:Cardreader();int fd_port;int open_port(int comport);int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop);int initcardreader(int fd_port);unsigned int checkcard(int fd_port);unsigned int readcardid (int fd_port);int beep(int fd_port);void autorun(void);void sendmessage(int data);signals:void message(QString);protected:private:;cpp文件#include cardreader.hCardreader: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;longvdisable;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)1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x06)return 0;/发送 0x00 0x52 0x00 0xad 0x03/usleep(40*1000);/等待40msbuffer0=0x00;buffer1=0x52;buffer2=0x00;buffer3=0xad;buffer4=0x03;write(fd_port,buffer,5);/等待0x20回应 否则出错退出usleep(40*1000);/等待50msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1500)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x20)return 0;/发送0x06buffer0=0x06;write(fd_port,buffer,1);/等待0x00 0x00 0x00 0xff 0x03回应 否则出错退出usleep(40*1000);/等待40msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x00)|(buffer1!=0x00)|(buffer2!=0x00)|(buffer3!=0xff)|(buffer4!=0x03)return 0;/发送开始符 0x20buffer0=0x20;write(fd_port,buffer,1);/等待0x06回应 否则出错退出usleep(40*1000);/等待40msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x06)return 0;/发送 00 4c 08 00 00 ff ff ff ff ff ff bb 03buffer0=0x00;buffer1=0x4c;buffer2=0x08;buffer3=0x00;buffer4=0x00;buffer5=0xff;buffer6=0xff;buffer7=0xff;buffer8=0xff;buffer9=0xff;buffer10=0xff;buffer11=0xbb;buffer12=0x03;write(fd_port,buffer,13);/等待0x20回应 否则出错退出usleep(40*1000);/等待40msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x20)return 0;/发送0x06buffer0=0x06;write(fd_port,buffer,1);/等待0x00 0x00 0x00 0xff 0x03回应 否则出错退出usleep(40*1000);/等待40msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x00)|(buffer1!=0x00)|(buffer2!=0x00)|(buffer3!=0xff)|(buffer4!=0x03)return 0;return 1;unsigned int Cardreader:checkcard(int fd_port)/* 检查天线范围内有无卡,有返回1,无或失败返回0 */unsigned char buffer32;int readnum;unsigned int timer;memset(buffer,0,sizeof(buffer);/buffer 缓冲区清0/发送开始符 0x20buffer0=0x20;write(fd_port,buffer,1);/等待0x06回应 否则出错退出usleep(40*1000);/等待40mstimer=0;memset(buffer,0,sizeof(buffer);/buffer 缓冲区清0doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出 /emit message(card found error 1);return 0; while (readnum=0);if (buffer0!=0x06)emit message(card found error 2);return 0;/发送 00 41 01 01 be 03buffer0=0x00;buffer1=0x41;buffer2=0x01;buffer3=0x01;buffer4=0xbe;buffer5=0x03;write(fd_port,buffer,6);/等待0x20回应 否则出错退出usleep(40*1000);/等待50msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x20)emit message(card found error 3);return 0;/发送0x06buffer0=0x06;write(fd_port,buffer,1);/等待0x00 0x00 0x02 0x04 0x00 0xf9 0x03回应usleep(50*1000);/等待40msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出emit message(card found error 4);return 0; while (readnum=0);if (buffer0!=0x00)|(buffer1!=0x00)|(buffer2!=0x02)|(buffer3!=0x04)|(buffer4!=0x00)|(buffer5!=0xf9)|(buffer6!=0x03)/emit message(card found error 5);return 0;return 1;unsigned int Cardreader:readcardid (int fd_port)/* 读取卡id号码,成功返回32位整数,无或失败返回0 */unsigned char buffer32;int readnum;unsigned int timer;unsigned int result;memset(buffer,0,sizeof(buffer);/buffer 缓冲区清0/发送开始符 0x20buffer0=0x20;write(fd_port,buffer,1);/等待0x06回应 否则出错退出usleep(40*1000);/等待40mstimer=0;memset(buffer,0,sizeof(buffer);/buffer 缓冲区清0doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x06)return 0;/发送 00 71 02 00 00 8c 03buffer0=0x00;buffer1=0x71;buffer2=0x02;buffer3=0x00;buffer4=0x00;buffer5=0x8c;buffer6=0x03;write(fd_port,buffer,7);/等待0x20回应 否则出错退出usleep(40*1000);/等待50msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x20)return 0;/发送0x06buffer0=0x06;write(fd_port,buffer,1);/等待0x00 0x00 0x04 0x04 . 0x03回应usleep(40*1000);/等待40msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x00)|(buffer1!=0x00)|(buffer2!=0x04)|(buffer8!=0x03)return 0;result=0;result=buffer3;result+=buffer48;result+=buffer516;result+=buffer61000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x06)return 0;/发送 00 60 04 0a 19 19 01 90 03buffer0=0x00;buffer1=0x60;buffer2=0x04;buffer3=0x0a;buffer4=0x19;buffer5=0x19;buffer6=0x01;buffer7=0x90;buffer8=0x03;write(fd_port,buffer,9);/等待0x20回应 否则出错退出usleep(40*1000);/等待50msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x20)return 0;/发送0x06buffer0=0x06;write(fd_port,buffer,1);/等待0x00 0x00 0x00 0xff 0x03回应usleep(40*1000);/等待40msmemset(buffer,0,sizeof(buffer);/buffer 缓冲区清0timer=0;doreadnum=read(fd_port,buffer,sizeof(buffer);usleep(100);timer+;if (timer1000)/等待超时则退出return 0; while (readnum=0);if (buffer0!=0x00)|(buffer1!=0x00)|(buffer2!=0x00)|(buffer3!=0xff)|(buffer4!=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;i20;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)emitmessage(QString:number(data,16);
展开阅读全文