📄 rfcarder_wm_10r.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 + -