📄 kdmcard.cpp
字号:
//'32H 读第二轨 '33H 读第三轨 '35H 读第1,2,3轨 '36H 清读/写缓冲区
sprintf(chSend, "%cC65%c", 0x02, 0x03);
bcc = KDM4787_BCC(chSend, strlen(chSend));
sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
if(!gCom.AsynSendData(chSend1, strlen(chSend1)))
{
return _ERR_KDE_MAGREAD1;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
return _ERR_KDE_MAGREAD1;
}
if(gCom.chRcvbuf[0]!=0x06)
return _ERR_KDE_MAGREAD1;
memset(chSend, '\0', 256);
ENQ(chSend);
if(!gCom.AsynSendData(chSend,strlen(chSend)))
{
return _ERR_KDE_MAGREAD2;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
return _ERR_KDE_MAGREAD2;
}
j = 0;
for (i=0;i<6;i++)
{
if(gCom.chRcvbuf[i]!=0x02)
{
chState[j] = gCom.chRcvbuf[i];
j++;
}
}
if(chState[0]!='P')
{
TraceDebug("state is not [P]!", 0);
return _ERR_KDE_STATUS;
}
*Trk1='\0';
for (;i<gCom.nRcvlen;i++)
{
if(gCom.chRcvbuf[i]==0x00)
break;
*Trk1 = gCom.chRcvbuf[i];
Trk1++;
}
*Trk1 = 0x00;
i++;
*Trk2='\0';
for (;i<gCom.nRcvlen;i++)
{
if(gCom.chRcvbuf[i]==0x00)
break;
*Trk2 = gCom.chRcvbuf[i];
Trk2++;
}
*Trk2 = 0x00;
i++;
*Trk3='\0';
for (;i<gCom.nRcvlen;i++)
{
if(gCom.chRcvbuf[i]==0x03)
break;
*Trk3 = gCom.chRcvbuf[i];
Trk3++;
}
*Trk3 = 0x00;
return _DEV_OK;
}
//Mode 0,前面退卡, 1,没收卡,后面吞卡
short CKDMCard::EjectCard(char Mode)
{
char chSend[256], chSend1[256], chState[20];
int bcc, i ,j;
int takebackpermit;
gTimeOut = 1;
memset(chSend, '\0', 256);
memset(chSend1, '\0', 256);
memset(chState, '\0', 20);
int EjectTimes=0;
EJECT:
//退卡命令' 'C' 33H pm (0x30'从前面,0x31'从后面,0x32'不退卡)
if(Mode == 1)
{
takebackpermit = GetPrivateProfileInt("KDE4787","TakeCardBack", 1, "KDDEV.INI");
if(takebackpermit != 1)
{
return _ERR_KDE_NOT_PERMIT_BACK;
}
sprintf(chSend, "%cC31%c", 0x02, 0x03);
}
else
sprintf(chSend, "%cC30%c", 0x02, 0x03);
bcc = KDM4787_BCC(chSend, strlen(chSend));
sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
if(!gCom.AsynSendData(chSend1, strlen(chSend1)))
{
gCom.AsynClose();
TraceDebug("Eject card fail1!", 0);
return _ERR_KDE_EJECT1;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
gCom.AsynClose();
return _ERR_KDE_EJECT1;
}
if(gCom.chRcvbuf[0]!=0x06)
{
TraceDebug("Eject card fail3!", 0);
EjectTimes++;
if(EjectTimes<2)
{
// ResetKDM(); //11月22日晚修改
Sleep((DWORD)100);
goto EJECT;
}
gCom.AsynClose(); //有可能产生溢出
return _ERR_KDE_EJECT1;
}
memset(chSend, '\0', 256);
ENQ(chSend);
if(!gCom.AsynSendData(chSend,strlen(chSend)))
{
gCom.AsynClose();
TraceDebug("Eject card fail4!", 0);
return _ERR_KDE_EJECT2;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
gCom.AsynClose();
TraceDebug("Eject card fail5!", 0); //11月21日改,可能会出现弹卡失败,从此退出程序,却没关串口
return _ERR_KDE_EJECT2;
}
j = 0;
for (i=0;i<gCom.nRcvlen;i++)
{
if(gCom.chRcvbuf[i]!=0x02)
{
if(gCom.chRcvbuf[i]==0x03)
break;
chState[j] = gCom.chRcvbuf[i];
j++;
}
}
gCom.AsynClose();/////
if(chState[0] != 'P')
return _ERR_KDE_STATUS;
if((chState[4] != '1')&&(chState[4] != '2'))
return _KDE_NOCARD;
else if(chState[4]=='1')
return _KDE_CARD_ATGATE;
return _KDE_CARD_INSIDE;
}
short CKDMCard::IcCardPower(short PowerMode, char *ATR)
{
char chSend[256],chSend1[256],State[20];
int bcc, i;
memset(chSend, '\0', 256);
memset(chSend1,'\0', 256);
memset(State, '\0', 20);
//IC卡上下电指令 ' 'C' 38H pm 'pm '30H 下电 '31H 上电
sprintf(chSend, "%cC8%d%c", 0x02, PowerMode, 0x03);
bcc = KDM4787_BCC(chSend, strlen(chSend));
sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
if(!gCom.AsynSendData(chSend1, strlen(chSend1)))
{
return _ERR_KDE_ICPOWER1;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
return _ERR_KDE_ICPOWER1;
}
if(gCom.chRcvbuf[0]!=0x06)
return _ERR_KDE_ICPOWER1;
memset(chSend, '\0', 256);
ENQ(chSend);
if(!gCom.AsynSendData(chSend,strlen(chSend)))
{
return _ERR_KDE_ICPOWER2;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
return _ERR_KDE_ICPOWER2;
}
memcpy(State,gCom.chRcvbuf,6);
State[6]='\0';
if(State[1]!=0x50)
{
return _ERR_KDE_ICPOWER2;
}
*ATR='\0';
for (i=6;i<gCom.nRcvlen;i++)
{
if(gCom.chRcvbuf[i]==0x03)
break;
*ATR = gCom.chRcvbuf[i];
ATR++;
}
*ATR = '\0';
return _DEV_OK;
}
short CKDMCard::SendICCommand(char *ICSendbuf, char *ICRecvbuf, char *ICSW)
{
char chRcvData[128],chSend[256];
char chIns[3];
memset(chSend,'\0',128);
PacketStr(ICSendbuf, chSend);
memcpy(chIns,&chSend[6],2);//指令
chIns[2]='\0';
//发送CPU指令
if(!gCom.AsynSendData(chSend, strlen(chSend)))
{
return _ERR_KDE_ICCOMM1;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
return _ERR_KDE_ICCOMM1;
}
if(gCom.chRcvbuf[0]!=0x06)
return _ERR_KDE_ICCOMM1;
memset(chSend, '\0', 128);
ENQ(chSend);
//发送05 0d
if(!gCom.AsynSendData(chSend,strlen(chSend)))
{
return _ERR_KDE_ICCOMM2;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
return _ERR_KDE_ICCOMM2;
}
short i, k=0,j=0,curr;
short nDataLen;
i = -1;
for (i=0; i<gCom.nRcvlen; i++)
if(gCom.chRcvbuf[i] == 0x02)
break;
if(i==gCom.nRcvlen)
return _ERR_KDE_ICCOMM2;
i++;
if(gCom.chRcvbuf[i]!=0x50)
return _ERR_KDE_ICCOMM2; //接收错误数据
i+=3;
if(strncmp(&gCom.chRcvbuf[i],"02",2)!=0)
return _ERR_KDE_ICCOMM2; //无卡错误返回
i+=2;
curr = i; //有效数据位置
memset(chRcvData, '\0', 128);
for(i=curr;i<gCom.nRcvlen;i++)
{
if(gCom.chRcvbuf[i]==0x03)
break;
chRcvData[j] = gCom.chRcvbuf[i];
j++;
}
memset(ICSW, '\0', 5);
memset(pICSW,'\0',5);
memset(pICRCV,'\0',256);
nDataLen = strlen(chRcvData);
if(nDataLen==4)
{
memcpy(ICSW,chRcvData,4);
memcpy(pICSW,chRcvData,4);
}
else
{
if(memcmp(chIns,&chRcvData[0],2)==0)
{
memcpy(ICRecvbuf,&chRcvData[2],nDataLen-6);
memcpy(ICSW,&chRcvData[nDataLen-4],4); //求出SW码
memcpy(pICRCV,&chRcvData[2],nDataLen-6);
memcpy(pICSW,&chRcvData[nDataLen-4],4); //求出SW码
}
else
{
memcpy(ICRecvbuf,&chRcvData[0],nDataLen-4);
memcpy(ICSW,&chRcvData[nDataLen-4],4); //求出SW码
memcpy(pICRCV,&chRcvData[0],nDataLen-4);
memcpy(pICSW,&chRcvData[nDataLen-4],4); //求出SW码
}
}
return 0;
}
void CKDMCard::PacketStr(char *InStr, char *OutStr)
{
char chSend[128];
short nLen,ret;
memset(chSend,'\0',128);
wsprintf(chSend,"%cC90%s%c",0x02,InStr,0x03);
nLen = strlen(chSend);
ret = KDM4787_BCC(chSend, strlen(chSend));
wsprintf(OutStr,"%s%c%c",chSend,ret,0x0d);
}
short CKDMCard::CloseDoor()
{
char chSend[256], chSend1[256];
int bcc, i, num = 0;
char State[128];
short ret;
ret = gOpenKDMCom();
if(ret == _NO_DEVICE)
return _NO_DEVICE;
else if(ret)
{
gCom.AsynClose();
return _ERR_KDE;
}
memset(chSend, '\0', 256);
memset(chSend1, '\0', 256);
//退卡命令' 'C' 33H pm (0x30'从前面,0x31'从后面,0x32'不退卡)
sprintf(chSend, "%cC%c1%c", 0x02,0x3a, 0x03);
bcc = KDM4787_BCC(chSend, strlen(chSend));
sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
if(!gCom.AsynSendData(chSend1, strlen(chSend1)))
{
return -1;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
return -1;
}
if(gCom.chRcvbuf[0]!=0x06)
return -2;
memset(chSend, '\0', 256);
ENQ(chSend);
if(!gCom.AsynSendData(chSend,strlen(chSend)))
{
return -1;
}
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
return -1;
}
*State = 0x00;
for (i=0;i<gCom.nRcvlen;i++)
{
if(gCom.chRcvbuf[i]!=0x02)
{
if(gCom.chRcvbuf[i]==0x03)
break;
State[i] = gCom.chRcvbuf[i];
}
}
*State = 0x00;
gCom.AsynClose();/////
return 0;
}
short CKDMCard::ResetKDM()
{
char chSend[128] ,chSend1[128],chState[20];
int i=0, bcc;
memset(chSend, '\0', 128);
memset(chSend1,'\0', 128);
memset(chState, '\0', 20);
//复位命令 DLE EOT
sprintf(chSend,"%cC%c%c%c",0x02, 0x10, 0x04, 0x03);
bcc = KDM4787_BCC(chSend, strlen(chSend));
sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
gCom.AsynSendData(chSend1,strlen(chSend1));
if(!gCom.sReadByEndChar(0x0d, gTimeOut))
{
return _ERR_KDE_RESET1;
}
if(gCom.chRcvbuf[0]!=0x10 || gCom.chRcvbuf[1]!=0x04)
return _ERR_KDE_RESET1;
//Clear Memory 36h 36h
memset(chSend, '\0', 128);
memset(chSend1,'\0', 128);
sprintf(chSend,"%cC%c%c%c",0x02, 0x36, 0x36, 0x03);
bcc = KDM4787_BCC(chSend, strlen(chSend));
sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
gCom.AsynSendData(chSend1,strlen(chSend1));
TraceDebug("Reset KDE OK!", 0);
return _DEV_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -