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

📄 pcsccom.cpp

📁 一个类似Smart Card PCSC协议
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	else
	{	
		switch(g_STUPortArray[nPortNum].nProtocolType)
		{
		case 0:
			nRtnValue = 256*szBuf[szBuf[3]+2] + szBuf[szBuf[3]+3];
			if(szBuf[3]-2 >= 0)
			{
				memcpy(pOutData,szBuf+4,szBuf[3]-2);		
				*nOutDataLen = szBuf[3]-2;
				pOutData[*nOutDataLen] = 0;
			}
			else
				return UINT(WRONG_READ_LENGTH);//length of reading data is wrong
			break;
		case 1:
			nRtnValue = 256*szBuf[szBuf[6]+5] + szBuf[szBuf[6]+6];
			if(szBuf[6]-2 >= 0)
			{
				memcpy(pOutData,szBuf+7,szBuf[6]-2);		
				*nOutDataLen = szBuf[6]-2;
				pOutData[*nOutDataLen] = 0;
			}
			else
				return UINT(WRONG_READ_LENGTH);//length of reading data is wrong
			break;
		default:
			nRtnValue = 256*szBuf[1] + szBuf[2];
			memcpy(pOutData,szBuf+4,szBuf[3]);		
			*nOutDataLen = szBuf[3];
			pOutData[*nOutDataLen] = 0;
			break;
		}		
	}

	return nRtnValue;
}

UINT PCSCCOM_API iDisconnectCard(UINT nPortNum)
{
	BYTE lBuf[1024];
	UINT nReadDataLen(0),nPackLen(0);
	CHAR szSendData[1024];
	char szErrorMsg[1024];
	BOOL bRtn(FALSE);

	if(INVALID_HANDLE_VALUE == g_STUPortArray[nPortNum].hPortFile)
		return UINT(FAIL_COMMUNICATE);
	memcpy(szSendData,"\x02",1);
	memcpy(szSendData+1,"01810080",8);
	memcpy(szSendData+9,"\x03",1);
	bRtn = bWriteData(nPortNum,szSendData,10);
	
	memset(lBuf,0,1024);
	if(! bReadData(nPortNum,lBuf,&nReadDataLen))
	{
		sprintf(szErrorMsg,"COM%d: iDisconnectCard failed to read data from port, SW:1111",nPortNum+1);
		pcscWriteErrorLog(szErrorMsg,3);
		return UINT(FAIL_READ_DATA);
	}
	lBuf[nReadDataLen] = 0;
	if(strcmp((char*)lBuf,(char*)"0190000091") != 0)
	{
		sprintf(szErrorMsg,"COM%d: iDisconnectCard reading data is wrong, %s",nPortNum+1,lBuf);
		pcscWriteErrorLog(szErrorMsg,3);
		return UINT(WRONG_RETURN_FORMAT);
	}
	g_STUPortArray[nPortNum].nTryConnect = 0;
	g_STUPortArray[nPortNum].fConnect = FALSE;
	return UINT(0x9000);
}

void  PCSCCOM_API ClosePort(UINT nPortNum)
{
	if(INVALID_HANDLE_VALUE == g_STUPortArray[nPortNum].hPortFile)
		return ;
	if(FALSE == g_STUPortArray[nPortNum].bOpen)
		return ;

#ifdef _DebugIC
	CHAR LogFile[32];
	sprintf(LogFile,"C:\\LogFile\\Close%d.txt",nPortNum+1);
	FILE *fp;
	fp = fopen(LogFile,"a+");
	fprintf(fp,"%d,----------\n",nPortNum+1);
	fclose(fp);
#endif

	g_STUPortArray[nPortNum].nTryConnect = 0;
	CloseHandle( g_STUPortArray[nPortNum].ReceiveEvent );
	CloseHandle(g_STUPortArray[nPortNum].ROverlapped.hEvent);
	CloseHandle(g_STUPortArray[nPortNum].hCardChangedMutex);
	PurgeComm(g_STUPortArray[nPortNum].hPortFile, PURGE_TXABORT | PURGE_RXABORT);	
	CloseHandle( g_STUPortArray[nPortNum].hPortFile );
	g_STUPortArray[nPortNum].bOpen = FALSE;
}

///////assisant function
BYTE  PCSCCOM_API cSumParityByte(BYTE *pInData, UINT nInDataLen)
{
	BYTE ch(0);
	UINT i;
	for(i=0;i<nInDataLen;i++)
		ch = ch^pInData[i];
	return ch;
}

BOOL  PCSCCOM_API bCheckParityByte(BYTE *pInData, UINT nInDataLen, BYTE cCheckParityByte)
{
	if( cSumParityByte(pInData,nInDataLen) != cCheckParityByte)
		return FALSE;
	return TRUE;
}

BOOL  PCSCCOM_API nPackHexToByte(BYTE *pInData, UINT nInDataLen, BYTE *pOutData, UINT *nOutDataLen)
{
	UINT i;
	BYTE ch1,ch2;
	if(nInDataLen%2) 
		return FALSE;
	for(i=0;i<nInDataLen/2;i++){
		//if((pInData[2*i] > '9') && (pInData[2*i] < '0'))
			ch1 = toupper(pInData[2*i]);
		//if((pInData[2*i+1] > '9') && (pInData[2*i+1] < '0'))
			ch2 = toupper(pInData[2*i+1]);
		if((ch1 >= 'A') && (ch1 <= 'F'))
			ch1 = ch1 - 'A' + 10;
		else
			ch1 = ch1 - '0';
		////
		if((ch2 >= 'A') && (ch2 <= 'F'))
			ch2 = ch2 - 'A' + 10;
		else
			ch2 = ch2 - '0';
		pOutData[i] = 16 * ch1 + ch2;
		*nOutDataLen = nInDataLen/2;
	}
	return TRUE;
}

void  PCSCCOM_API pcscWriteErrorLog(char szErrorMsg[1024],UINT nErrLogType)
{
	char szBuf[_MAX_PATH],szDate[10],szCurrentWorkDir[_MAX_PATH];
	FILE *fp = NULL;

	_getcwd(szCurrentWorkDir,_MAX_PATH);
	strcpy(szBuf,szCurrentWorkDir);
	strcat(szBuf,"\\ErrLog");
	_mkdir(szBuf);
	_strdate(szDate);
	szDate[2] = szDate[3];
	szDate[3] = szDate[4];
	szDate[4] = '\0';

	switch(nErrLogType){
	case 0://write IC error log
		strcat(szBuf,"\\_IC");
		strcat(szBuf,szDate);
		strcat(szBuf,".txt");
		break;
	case 1://write system error log
		strcat(szBuf,"\\_Sys");
		strcat(szBuf,szDate);
		strcat(szBuf,".txt");
		break;
	case 2://write initialization error log
		strcat(szBuf,"\\_Ini");
		strcat(szBuf,szDate);
		strcat(szBuf,".txt");
		break;
	case 3://write other debug log
		strcat(szBuf,"\\_Oth");
		strcat(szBuf,szDate);
		strcat(szBuf,".txt");
		break;
	}

	fp = fopen(szBuf,"a+");
	if(fp != NULL){
		fprintf(fp,"%s\n",szErrorMsg);
		fclose(fp);
	}
}/**/

DWORD WINAPI PortThreadProc( UINT nPortNum )
{
	DWORD CommEvent;
	
	DWORD NOBTransfered;
	char Buffer[ 560 ];
	//UINT nPortNum;
	BOOL fReadStatus(FALSE);
	CHAR *pStartCode,*pStopCode;

	DWORD dwErrorFlags;
	UINT nTryNUm=0;

	COMSTAT ComStat ;
	DWORD dwLength;
	//nPortNum = atoi((char*)lpParam);

	while ( 1 ){
		WaitForSingleObject( g_STUPortArray[nPortNum].ReceiveEvent, 260 );
		nTryNUm++;
		if(nTryNUm > 6)
			break;
		ResetEvent( g_STUPortArray[nPortNum].ROverlapped.hEvent );
		WaitCommEvent( g_STUPortArray[nPortNum].hPortFile, &CommEvent, &(g_STUPortArray[nPortNum].ROverlapped) );

		if (CommEvent & EV_RXCHAR){
			ClearCommError(g_STUPortArray[nPortNum].hPortFile, &dwErrorFlags, &ComStat ) ;
			dwLength = ComStat.cbInQue ; //how many data in input buffer
			if(dwLength > 0){
				pStartCode = pStopCode = NULL;
				NOBTransfered = 0;
				fReadStatus = ReadFile( g_STUPortArray[nPortNum].hPortFile, Buffer, dwLength, &NOBTransfered, &(g_STUPortArray[nPortNum].ROverlapped) );
				if(! fReadStatus){
					if(GetLastError() == ERROR_IO_PENDING){
						while(! GetOverlappedResult( g_STUPortArray[nPortNum].hPortFile, &(g_STUPortArray[nPortNum].ROverlapped), &NOBTransfered, FALSE )){
							if(GetLastError() != ERROR_IO_PENDING)
								break;							
						}					
					}
					
				}
				if ( NOBTransfered > 0){//succeed in reading data from port
					Buffer[NOBTransfered] = 0;
					g_STUPortArray[nPortNum].LastReceivedLength += NOBTransfered;//handle reading data
					strcat(g_STUPortArray[nPortNum].LastReceivedBuffer,Buffer);
					//SetEvent( g_STUPortArray[nPortNum].ReceiveEvent );
					
					pStartCode = strrchr(g_STUPortArray[nPortNum].LastReceivedBuffer,0x02);
					pStopCode = strrchr(g_STUPortArray[nPortNum].LastReceivedBuffer,0x03);
					if((pStartCode != NULL) && (pStopCode != NULL)){
						CHAR InsertCard[16];
						if((pStopCode - pStartCode) < 15){
							memcpy(InsertCard,pStartCode+1,pStopCode-pStartCode-1);
							InsertCard[pStopCode-pStartCode-1] = 0;
						}
						if((strcmp(InsertCard,"01FF000112ED")==0) || (strcmp(InsertCard,"01FF0100FF")==0) || (strcmp(InsertCard,"01FF0200FC")==0)){
							g_STUPortArray[nPortNum].fReadReady = FALSE;
							g_STUPortArray[nPortNum].LastReceivedLength = 0;
							memset(g_STUPortArray[nPortNum].LastReceivedBuffer,0,560);
							ResetEvent( g_STUPortArray[nPortNum].ReceiveEvent );
							continue;
						}

						g_STUPortArray[nPortNum].fReadReady = TRUE;
						SetEvent( g_STUPortArray[nPortNum].ReceiveEvent );
#ifdef _DebugIC
						CHAR LogFile[32];
						sprintf(LogFile,"C:\\LogFile\\Proc%d.txt",nPortNum+1);
						FILE *fp;
						fp = fopen(LogFile,"a+");
						fprintf(fp,"%d,%s\n",g_STUPortArray[nPortNum].LastReceivedLength,g_STUPortArray[nPortNum].LastReceivedBuffer);
						fclose(fp);
#endif
						return 0;
					}
					
				}
			}
		}		
	} 
	return 0;
}
//////////////////////////////////////
//incoming
BOOL  bReadData(UINT nPortNum, BYTE *pReadBuf, UINT *nReadDataLen)
{
	CHAR *pStartCode,*pStopCode;
	
	PortThreadProc( nPortNum );//read data from com port

	FILE *fp;

	if(g_STUPortArray[nPortNum].LastReceivedLength > 0){
		pStartCode = strrchr(g_STUPortArray[nPortNum].LastReceivedBuffer,0x02);
		pStopCode  = strrchr(g_STUPortArray[nPortNum].LastReceivedBuffer,0x03);
		if((pStartCode != NULL) && (pStopCode != NULL)){  //0     1   2   3   4   5				
			*nReadDataLen = pStopCode - pStartCode - 1;   //\x02\x11\x11\x11\x11\x03
			//*nReadDataLen = nDataLen;
			memcpy(pReadBuf,pStartCode+1,*nReadDataLen);
			pReadBuf[*nReadDataLen]= 0;

			/*char szReadData[256];
			for(UINT i=0; i<*nReadDataLen; i++)
				sprintf(szReadData+2*i, "%02X", pReadBuf[i]);
			fp = fopen("C:\\Debug.txt", "a+");
			fprintf(fp, "COM%d: %s\n", nPortNum, szReadData);
			fclose( fp );*/
#ifdef _DebugIC
			CHAR LogFile[32];
			sprintf(LogFile,"C:\\LogFile\\Read%d.txt",nPortNum+1);			
			fp = fopen(LogFile,"a+");
			fprintf(fp,"%d,%s\n",*nReadDataLen,pReadBuf);
			fclose(fp);
#endif
		}
		else{
			fp = fopen("C:\\FailRead.txt","a+");
			fprintf(fp,"COM%d: Start/stop code of reading data is wrong:start %s,stop %s\n",nPortNum+1,pStartCode,pStopCode);
			fclose(fp);
			return FALSE;
		}		
	}
	else{
		fp = fopen("C:\\FailRead.txt","a+");
		fprintf(fp,"COM%d: length of reading data is 0\n",nPortNum+1);
		fclose(fp);
		return FALSE;
	}
	return TRUE;
}
//////////////////////////////////////////
//outgoing
BOOL  bWriteData(UINT nPortNum, CHAR *pWriteBuf, UINT nWriteDataLen)
{
	BOOL fState;	
	//COMSTAT ComStat;
	//DWORD dwErrorFlags;

	DWORD length;
	CHAR szBuffer[560];

	//clear up input buffer
	g_STUPortArray[nPortNum].fReadReady = FALSE;
	g_STUPortArray[nPortNum].LastReceivedLength = 0;
	memset(g_STUPortArray[nPortNum].LastReceivedBuffer,0,560);
	ResetEvent( g_STUPortArray[nPortNum].ReceiveEvent );

	length = nWriteDataLen;
	memcpy(szBuffer,pWriteBuf,nWriteDataLen);
	//ClearCommError(g_STUPortArray[nPortNum].hPortFile,&dwErrorFlags,&ComStat);
	fState=WriteFile(g_STUPortArray[nPortNum].hPortFile,szBuffer,length,&length,&(g_STUPortArray[nPortNum].WOverlapped));

	if(!fState){
		if(GetLastError()==ERROR_IO_PENDING){
			while(! GetOverlappedResult(g_STUPortArray[nPortNum].hPortFile,&(g_STUPortArray[nPortNum].WOverlapped),&length,TRUE)){
				if(GetLastError() != ERROR_IO_PENDING)
					break;
			}
		}
	}

	return TRUE;
}

UINT PCSCCOM_API bSetMemoryICType(UINT nPortNum, CHAR* pMemoryICType, UINT nICTypeLen)
{
	BYTE lBuf[1024];
	UINT nReadDataLen(0);
	CHAR szSendData[1024];
	UINT iRtn(0);
	char szErrorMsg[1024];

	memcpy(szSendData,"\x02",1);
	memcpy(szSendData+1,pMemoryICType,nICTypeLen);
	memcpy(szSendData+1+nICTypeLen,"\x03",1);
	bWriteData(nPortNum,szSendData,2+nICTypeLen);
	memset(lBuf,0,1024);
	iRtn = bReadData(nPortNum,lBuf,&nReadDataLen);
	if(iRtn != TRUE){
		szSendData[2+nICTypeLen] = 0;
		sprintf(szErrorMsg,"COM%d: failed to set protocol %s ,sw:1111",nPortNum+1, szSendData);
		pcscWriteErrorLog(szErrorMsg,3);
		return UINT(FAIL_READ_DATA);
	}
	else
	{
		lBuf[nReadDataLen] = 0;
		if(strcmp((char*)lBuf,(char*)"0190000091") != 0)
		{
			sprintf(szErrorMsg,"COM%d: failed to set protocol %s ,returning code is wrong %s,sw:3333",nPortNum+1, szSendData, lBuf);
			pcscWriteErrorLog(szErrorMsg,3);
			return UINT(WRONG_RETURN_FORMAT);
		}
	}
	return UINT(0x9000);
}

⌨️ 快捷键说明

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