⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfcarder_wm_10r.cpp

📁 基于mips嵌入式非接触式IC卡读卡器程序源码
💻 CPP
字号:
// RFCarder_WM_10R.cpp: implementation of the CRFCarder_WM_10R class.////////////////////////////////////////////////////////////////////////#include <stdio.h>#include <string.h>#include <unistd.h>#include "RFCarder_WM_10R.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CRFCarder_WM_10R::CRFCarder_WM_10R(){}CRFCarder_WM_10R::~CRFCarder_WM_10R(){}//开串口//参数:uiPort:长度串口号//     ulBaudRate:波特率//		CommHandle:串口句柄//返回: 0:正确; 1:错 unsigned int CRFCarder_WM_10R::uiOpenComm(unsigned int uiPort,unsigned long ulBaudRate,										  int *CommHandle){	bool bRtn;	bRtn=Open( uiPort, 9600 );	if(bRtn)	{	*CommHandle=m_hIDComDev;		return 0;	}else return 1;	}//关串口//参数:uiPort:长度串口号//		CommHandle:串口句柄//返回: 0:正确; 1:错 unsigned int CRFCarder_WM_10R::uiCloseComm(unsigned int uiPort,int *CommHandle){	m_hIDComDev=*CommHandle;	Close();	return 0;}//串口测试//参数:CommHandle:串口句柄//		pcOutBuff:输出数据//		piOutLen:输出数据长度//返回: 0:正确; 1:发送错; 2:超时; 3:程序错 4:结束符错; 4:校验和错; 20:设备执行命令不成功unsigned int CRFCarder_WM_10R::uiCommTest(int *CommHandle,char *pcOutBuff,int *piOutLen){	char cBuff[20];	char cCheckSum=0;	int iI,iRtn;	unsigned uiRtn;	m_hIDComDev=*CommHandle;	memcpy(cBuff,"\x3c\x04\x00\x60\x00\x00",6);	for(iI=0; iI<6; iI++)		cCheckSum=cCheckSum^cBuff[iI];	cBuff[iI]=cCheckSum; iI++;	cBuff[iI]=0x0d; iI++;	iRtn=SendData( cBuff, iI );	if(iRtn)	{		uiRtn=uiReceiveAgreement(0,0,pcOutBuff,piOutLen);		if(uiRtn) return (uiRtn+1);		if(*(pcOutBuff+2)==0x00) return 20;		return 0;	}else return 1;}//向设备下载密码//参数:CommHandle:串口句柄//		cKey_AB:密码种类 0:A密码 1:B密码//		cSection_Id:扇区号//		pcKey:密码数据//		pcOutBuff:输出数据//		piOutLen:输出数据长度//返回: 0:正确; 1:发送错; 2:超时; 3:程序错 4:结束符错; 4:校验和错; 20:设备执行命令不成功unsigned int CRFCarder_WM_10R::uiLoadKey_Device(int *CommHandle,												char cKey_AB,char cSection_Id,char *pcKey,												char *pcOutBuff,int *piOutLen){	char cBuff[200];	char cCheckSum=0;	int iI,iRtn;	unsigned uiRtn;	m_hIDComDev=*CommHandle;	memcpy(cBuff,"\x3c\x0a\x01\x69",4);	cBuff[4]=cKey_AB;	cBuff[5]=cSection_Id;	memcpy(&cBuff[6],pcKey,6);	for(iI=0; iI<12; iI++)		cCheckSum=cCheckSum^cBuff[iI];	cBuff[iI]=cCheckSum; iI++;	cBuff[iI]=0x0d; iI++;	iRtn=SendData( cBuff, iI );	if(iRtn)	{		uiRtn=uiReceiveAgreement(0,0,pcOutBuff,piOutLen);		if(uiRtn) return (uiRtn+1);		if(*(pcOutBuff+1)==0x01) return 20;		return 0;	}else return 1;}//寻卡//参数:CommHandle:串口句柄//		cWorkMode:工作模式 0:卡片读写完成后离开感应区才可再次操作//						   1:卡片读写完成后卡关闭即可再次操作//		cSection_Id:扇区号//		pcKey:密码数据//		pcOutBuff:输出数据//		piOutLen:输出数据长度//		pcCard_Id:卡的Id号//返回: 0:正确; 1:发送错; 2:超时; 3:程序错 4:结束符错; 4:校验和错; 20:设备执行命令不成功unsigned int CRFCarder_WM_10R::uiFindCard(int *CommHandle,char cWorkMode,										  char *pcOutBuff,int *piOutLen,char *pcCard_Id){	char cBuff[20];	char cCheckSum=0;	int iI,iRtn;	unsigned uiRtn;	m_hIDComDev=*CommHandle;	memcpy(cBuff,"\x3c\x04\x01\x70\x00\x00",6);	cBuff[4]=cWorkMode;	for(iI=0; iI<6; iI++)		cCheckSum=cCheckSum^cBuff[iI];	cBuff[iI]=cCheckSum; iI++;	cBuff[iI]=0x0d; iI++;	iRtn=SendData( cBuff, iI );   	if(iRtn)	{		uiRtn=uiReceiveAgreement(0,0,pcOutBuff,piOutLen);		if(uiRtn) return (uiRtn+1);		if(*(pcOutBuff+1)==0x01) return 20;		memcpy(pcCard_Id,pcOutBuff+2,4);		return 0;	}else return 1;}//密码认证//参数:CommHandle:串口句柄//		cKey_AB:密码种类 0:A密码 1:B密码//		cWorkMode:工作模式 0:卡片读写完成后离开感应区才可再次操作//						   1:卡片读写完成后卡关闭即可再次操作//		cBlock_Id:统一编址的块号0-63//		pcCard_Id:卡的Id号//		pcOutBuff:输出数据//		piOutLen:输出数据长度//返回: 0:正确; 1:发送错; 2:超时; 3:程序错 4:结束符错; 4:校验和错; 20:设备执行命令不成功unsigned int CRFCarder_WM_10R::uiAuthenticatKey(int *CommHandle,char cKey_AB,												char cBlock_Id,char *pcCard_Id,												 char *pcOutBuff,int *piOutLen){	char cBuff[20];	char cCheckSum=0;	int iI,iRtn;	unsigned uiRtn;	m_hIDComDev=*CommHandle;	memcpy(cBuff,"\x3c\x08\x01\x6a",4);	cBuff[4]=cKey_AB;	cBuff[5]=cBlock_Id;	memcpy(&cBuff[6],pcCard_Id,4);	for(iI=0; iI<10; iI++)		cCheckSum=cCheckSum^cBuff[iI];	cBuff[iI]=cCheckSum; iI++;	cBuff[iI]=0x0d; iI++;	iRtn=SendData( cBuff, iI );	if(iRtn)	{		uiRtn=uiReceiveAgreement(0,0,pcOutBuff,piOutLen);		if(uiRtn) return (uiRtn+1);		if(*(pcOutBuff+1)==0x01) return 20;		memcpy(pcCard_Id,pcOutBuff+2,4);		return 0;	}else return 1;}//读一个块//参数:CommHandle:串口句柄//		cKey_AB:密码种类 0:A密码 1:B密码//		cBlock_Id:统一编址的块号0-63//		pcCard_Id:卡的Id号//		pcOutBuff:输出数据//		piOutLen:输出数据长度//		pcOutCardData:16个字节的卡片数据(一个块的)//返回: 0:正确; 1:发送错; 2:超时; 3:程序错 4:结束符错; 4:校验和错; 20:设备执行命令不成功unsigned int CRFCarder_WM_10R::uiReadCard_Block(int *CommHandle,char cBlock_Id,												char *pcOutBuff,int *piOutLen,												char *pcOutCardData){	char cBuff[50];	char cCheckSum=0;	int iI,iRtn;	unsigned uiRtn;	m_hIDComDev=*CommHandle;	memcpy(cBuff,"\x3c\x04\x01\x66\x00\x00",6);	cBuff[4]=cBlock_Id;	for(iI=0; iI<6; iI++)		cCheckSum=cCheckSum^cBuff[iI];	cBuff[iI]=cCheckSum; iI++;	cBuff[iI]=0x0d; iI++;	iRtn=SendData( cBuff, iI );	if(iRtn){		uiRtn=uiReceiveAgreement(1,1,pcOutBuff,piOutLen);				if(uiRtn) return (uiRtn+1);				if(*(pcOutBuff+1)==0x01) return 20;			memcpy(pcOutCardData,pcOutBuff,20);			return 0;	}else return 1;}//关闭卡//参数:CommHandle:串口句柄//		pcOutBuff:输出数据//		piOutLen:输出数据长度//返回: 0:正确; 1:发送错; 2:超时; 3:程序错 4:结束符错; 4:校验和错; 20:设备执行命令不成功unsigned int CRFCarder_WM_10R::uiClose_Card(int *CommHandle,											char *pcOutBuff,int *piOutLen){	char cBuff[20];	int iRtn;	unsigned int uiRtn;		m_hIDComDev=*CommHandle;	memcpy(cBuff,"\x3c\x04\x01\x68\x00\x00\x51\x0d",8);	iRtn=SendData( cBuff, 8 );	if(iRtn)	{		uiRtn=uiReceiveAgreement(0,0,pcOutBuff,piOutLen);		if(uiRtn) return (uiRtn+1);		if(*(pcOutBuff+1)==0x01) return 20;		return 0;	}else return 1;}//关闭射频电路//参数:CommHandle:串口句柄//		pcOutBuff:输出数据//		piOutLen:输出数据长度//返回: 0:正确; 1:发送错; 2:超时; 3:程序错 4:结束符错; 4:校验和错; 20:设备执行命令不成功unsigned int CRFCarder_WM_10R::uiSwitch_RFCircuitry(int *CommHandle,char cSwitchState,											char *pcOutBuff,int *piOutLen){	char cBuff[50];	char cCheckSum=0;	int iI,iRtn;	unsigned uiRtn;	m_hIDComDev=*CommHandle;	memcpy(cBuff,"\x3c\x03\x01\x72",4);	cBuff[4]=cSwitchState;	for(iI=0; iI<5; iI++)		cCheckSum=cCheckSum^cBuff[iI];	cBuff[iI]=cCheckSum; iI++;	cBuff[iI]=0x0d; iI++;	iRtn=SendData( cBuff, 8 );	if(iRtn)	{		uiRtn=uiReceiveAgreement(0,0,pcOutBuff,piOutLen);		if(uiRtn) return (uiRtn+1);		if(*(pcOutBuff+1)==0x01) return 20;		return 0;	}else return 1;}//LED闪烁一次//参数:CommHandle:串口句柄//		uiTime:时间void CRFCarder_WM_10R::vLEDTwinkle(int *CommHandle,unsigned long ulTime){	char cBuff[10];	char cCheckSum=0;	int iI,iRtn;	m_hIDComDev=*CommHandle;	//memcpy(cBuff,"\x3c\x03\x01\x6d\x55",5);	memcpy(cBuff,"\x3c\x03\x00\x00\x00",5);	for(iI=0; iI<5; iI++)		cCheckSum=cCheckSum^cBuff[iI];	cBuff[iI]=cCheckSum; iI++;	cBuff[iI]=0x0d; iI++;	iRtn=SendData( cBuff, iI );}//蜂鸣器响一声//参数:CommHandle:串口句柄//		uiTime:时间void CRFCarder_WM_10R::vSpeaker(int *CommHandle,unsigned long ulTime){	char cBuff[10];	char cCheckSum=0;	int iI,iRtn,bRtn;        unsigned int uiPort;	m_hIDComDev=*CommHandle;	memcpy(cBuff,"\x3c\x03\x01\x6b",4);	for(iI=0; iI<4; iI++)		cCheckSum=cCheckSum^cBuff[iI];	sprintf(cBuff+iI,"%C",ulTime);    	cCheckSum=cCheckSum^cBuff[iI];		iI++;	cBuff[iI]=cCheckSum; iI++;	cBuff[iI]=0x0d; iI++;	iRtn=SendData( cBuff, iI );      }	char cno[10];//接收协议//参数:uiLengthAmend:长度修正值//     cAmendSymbol:长度修正符 0:加 1:减//		pcOutBuff:输出数据//		piOutLen:输出数据长度//返回: 0:正确; 1:超时; 2:程序错 3:结束符错; 4:校验和错unsigned int CRFCarder_WM_10R::uiReceiveAgreement(unsigned int uiLengthAmend,char cAmendSymbol,												  char *pcOutBuff,int *piOutLen){	char cTemp;	char cBuff[200];	char ccc;	int iRtn=0;	int iTag=0,iDataLen,iRecLen;	char cCheckSum=0;	memset(cBuff,0,sizeof(cBuff));	while(1)	{ 		iRtn=WReadData(&cTemp,1);              		switch(iTag)		{		case 0: if(cTemp==0x3c)				{ cBuff[0]=cTemp; iTag=1;				}				break;		case 1: iDataLen=cTemp; iRecLen=2;				cBuff[1]=cTemp;				iTag=2;				break;		case 2: cBuff[iRecLen]=cTemp;				iRecLen++;				if(cAmendSymbol==0x00)				{ if(iRecLen>=(iDataLen+2+2+uiLengthAmend))						iTag=3;				}else{ if(iRecLen>=(iDataLen+2+2-uiLengthAmend))							iTag=3;					}									break;		}		if(iTag>=3) break;	}	if(iTag!=3) return 2; 	//if(cBuff[iRecLen-1]!=0x0d) return 3;	cCheckSum=0;	for(iTag=0; iTag<iRecLen-2; iTag++)		cCheckSum=cCheckSum^cBuff[iTag];	//if(cCheckSum!=cBuff[iRecLen-2]) return 4;		*piOutLen=iRecLen;	int i;	if (iRecLen==9)	{	     for(i=2;i<6;i++)	 {		 ccc=cBuff[i];        sprintf(cno+(i-2)*2,"%02X",ccc);	 }	    *(cno+(i-2)*2)=' ';		*(cno+(i-2)*2+1)=' ';	}	if (iRecLen==21)	{		memcpy(pcOutBuff,cno,10);     for(i=3;i<19;i++)	 {		 ccc=cBuff[i];        sprintf(pcOutBuff+(i-3)*2+10,"%02X",ccc);	 }	    *(pcOutBuff+(i-3)*2+10)='0';		return 0;	}	memcpy(pcOutBuff,cBuff,iRecLen);	return 0;}//有无卡//参数:CommHandle:串口句柄//		cWorkMode:工作模式 0:卡片读写完成后离开感应区才可再次操作//						   1:卡片读写完成后卡关闭即可再次操作//		pcOutData:输出数据//		piOutLen:输出数据长度//		pcOutCardData:4个字节的卡号//返回(R): R=0:正确;//		  100<R<200:寻卡错; 200<R<300:关闭卡错;//		  1:发送错; 2:超时; 3:程序错 4:结束符错; 4:校验和错; 20:设备执行命令不成功unsigned int CRFCarder_WM_10R::uiIsHaveCard(int *CommHandle,char cWorkMode,												char *pcOutData,int *piOutLen,												char *pcOutCardData){	unsigned int uiRtn,uiRtn1;	char cBuff[200];	int iLen=0;//	uiRtn=WM_10R.uiOpenComm(2,9600,&CommHandle);//	if(uiRtn) return;	memset(cBuff,0,sizeof(cBuff));	uiRtn=uiFindCard(CommHandle,cWorkMode,pcOutData,piOutLen,cBuff);	memcpy(pcOutCardData,cBuff,4);	if(uiRtn) uiRtn=uiRtn+100;	memset(cBuff,0,sizeof(cBuff));	uiRtn1=uiClose_Card(CommHandle,cBuff,&iLen);	if(uiRtn1) uiRtn1=uiRtn1+200;//	WM_10R.uiCloseComm(2,&CommHandle);	return uiRtn;}//读一个块数据//参数:CommHandle:串口句柄//		cWorkMode:工作模式 0:卡片读写完成后离开感应区才可再次操作//						   1:卡片读写完成后卡关闭即可再次操作//		cKey_AB:密码种类 0:A密码 1:B密码//		cBlock_Id:统一编址的块号0-63//		pcOutData:输出数据//		piOutLen:输出数据长度//		pcOutCardData:16个字节的卡片数据(一个块的)//返回(R): R=0:正确;//		  100<R<200:寻卡错; 200<R<300:密码认证错; 300<R<400:读卡块错; 400<R<500:关闭卡错;//		  1:发送错; 2:超时; 3:程序错 4:结束符错; 4:校验和错; 20:设备执行命令不成功unsigned int CRFCarder_WM_10R::uiReadCardBlock(int *CommHandle,											   char cWorkMode,char cKey_AB,char cBlock_Id,												char *pcOutData,int *piOutLen,												char *pcOutCardData){      	unsigned int uiRtn,uiRtn1;	char cBuff[200];	int iLen=0;	for (int i =0; i<1; i++)	{		memset(cBuff,0,sizeof(cBuff));		uiRtn=uiFindCard(CommHandle,cWorkMode,pcOutData,piOutLen,cBuff);		memcpy( pcOutCardData,cBuff,4);		if(!uiRtn)		{			uiRtn=uiAuthenticatKey(CommHandle,cKey_AB,cBlock_Id,cBuff, pcOutData,piOutLen);		usleep(200000);		if(!uiRtn)		 {			uiRtn=uiReadCard_Block(CommHandle,cBlock_Id,pcOutData,piOutLen,pcOutCardData);				    if(!uiRtn) 		    {		            uiRtn1=uiClose_Card( CommHandle,cBuff,&iLen);		    }		    else{			       }		    }		else{		   }		}	else{	usleep(200000);		   }	}	/*memset(cBuff,0,sizeof(cBuff));	uiRtn1=uiClose_Card(CommHandle,cBuff,&iLen);	if(uiRtn1) uiRtn1=uiRtn1+400;*/        return uiRtn;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -