📄 pcsccom.cpp
字号:
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 + -