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

📄 rewr.cpp

📁 用于IC卡读写器操作RF500射频卡的d
💻 CPP
字号:
#include "stdafx.h"
#define LOUExport  extern "C" _declspec( dllexport )
#define ZERO_MEMORY(s)  ::ZeroMemory(&s, sizeof(s))

HANDLE hCommDev=INVALID_HANDLE_VALUE;
int  WaitFor(DWORD Timeout,DWORD Bytes,byte * inBuff)
{
	DWORD OldTime,NowTime,nBytesRead;
	EscapeCommFunction(hCommDev,SETRTS);
	OldTime=GetTickCount();
	do
	{
		NowTime=GetTickCount();
		if((NowTime-OldTime)>Timeout) 
		{
			EscapeCommFunction(hCommDev,CLRRTS);
			PurgeComm(hCommDev,PURGE_RXCLEAR);
			return -1;
		}
		
		if(::ReadFile(hCommDev, inBuff, Bytes, &nBytesRead, NULL))
		{
			NowTime=GetTickCount();
			EscapeCommFunction(hCommDev,CLRRTS);
			PurgeComm(hCommDev,PURGE_RXCLEAR);
			//::PurgeComm(hCommDev, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
			return nBytesRead;
		}

	}while(true);

}

bool Trasmit(HANDLE hFile,byte * buf, int num) 
{
	EscapeCommFunction(hCommDev,CLRRTS);
	DWORD x;
	for (int i=0;i<num;i++)
	{
		if (!WriteFile(hCommDev,buf+i,1,&x,NULL))// TransmitCommChar(hFile,buf[i])
			return false;
		WaitCommEvent(hCommDev,&x,NULL);
	}		
	FlushFileBuffers(hCommDev);
	Sleep(1);
	return true;
}
//打开串行口
LOUExport  bool WINAPI InitRewr(int x)
{
   if (hCommDev != INVALID_HANDLE_VALUE)
	   return true;
	// open communcations file
   CString strPort;
   if((x > 2)||(x<1))
   {
      return false;
   }
   else
   {
      strPort.Format(_T("COM%d"), x);
   }

   hCommDev = ::CreateFile(strPort, GENERIC_READ|GENERIC_WRITE, 
				0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

   if(hCommDev == INVALID_HANDLE_VALUE)
      return FALSE;
   BOOL bPurge = FALSE;
   // get any early notifications
   if(::SetCommMask(hCommDev, EV_TXEMPTY)) 
   {
      // setup device buffers
      if(::SetupComm(hCommDev, 1024, 0))
      {
         // purge any information in the buffer
         if(::PurgeComm(hCommDev, PURGE_TXABORT|PURGE_RXABORT|
                                  PURGE_TXCLEAR|PURGE_RXCLEAR))
         {
            bPurge = TRUE;
         }
      }
   }
   
   if(!bPurge)
   {
      ::CloseHandle(hCommDev);
      return FALSE;
   }

   // set up for overlapped I/O
   COMMTIMEOUTS CommTimeOuts;

   CommTimeOuts.ReadIntervalTimeout = 10L;
   CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
   CommTimeOuts.ReadTotalTimeoutConstant = 200L;
   CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
   CommTimeOuts.WriteTotalTimeoutConstant = 0L; //send imidiately 

   if(!::SetCommTimeouts(hCommDev, &CommTimeOuts))
   {
      ::CloseHandle(hCommDev);
      return FALSE;
   }

   // set up the connect
   DCB dcb;
   ZERO_MEMORY(dcb);
   dcb.DCBlength = sizeof(DCB);

   if(!::GetCommState(hCommDev, &dcb))
   {
      ::CloseHandle(hCommDev);
      return FALSE;
   }

   dcb.BaudRate = CBR_19200;//CBR_9600;//
   dcb.ByteSize = 8;
   dcb.Parity = NOPARITY;
   dcb.StopBits = ONESTOPBIT;

   // setup hardware flow control
   dcb.fDtrControl = DTR_CONTROL_ENABLE;
   dcb.fRtsControl = RTS_CONTROL_DISABLE;
   // setup software flow control
   dcb.fInX = dcb.fOutX = false;
   //dcb.XonChar = '\xAA';
   //dcb.XoffChar = '\xEE';
   //dcb.XonLim = 100;
   //dcb.XoffLim = 100;
   dcb.fOutxCtsFlow=false;
   dcb.fOutxDsrFlow=false;
   // other various settings
   dcb.fBinary = TRUE;
   dcb.fParity = false;

   if(!::SetCommState(hCommDev, &dcb))
   {
      ::CloseHandle(hCommDev);
      return FALSE;
   }
   EscapeCommFunction(hCommDev,CLRRTS);
   return true;
}
//关串口
LOUExport bool WINAPI CloseRewr()
{
	if (!hCommDev)
		return FALSE;
	if (CloseHandle(hCommDev))
	{
		hCommDev=INVALID_HANDLE_VALUE;
		return TRUE;
	}
	return FALSE;
}
///////////////////////////////////

LOUExport bool WINAPI mif_reset()
{
	byte buf[30];
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x01;
	buf[4]=0x01;
	buf[5]=0x01;
	buf[6]=0xee;
	if (!Trasmit(hCommDev,buf,7))
	{
		return false;
	}
	WaitFor(100,5,buf);
	if (buf[2]==0xad)
		return true;
	else
		return false;
}


LOUExport bool WINAPI mif_halt()
{
	byte buf[30];
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x01;
	buf[4]=0x09;
	buf[5]=0x09;
	buf[6]=0xee;
	if (!Trasmit(hCommDev,buf,7))
	{
		return false;
	}
	WaitFor(100,5,buf);
	if (buf[2]==0xad)
		return true;
	else
		return false;
}
////////////////////////////////////////////////
bool CheckSum(int recnum, byte *pBuf)
{
	if (recnum<=5)
		return false;
	byte checksum=0;
	for (int i=2; i<recnum-2; i++)
		checksum+=pBuf[i];
	if ((checksum==pBuf[recnum-2]))
		return true;
	return false;
}

LOUExport bool WINAPI mif_request(byte mode, byte * tag)
{
	byte buf[30];
	int x;
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x02;
	buf[4]=0x02;
	buf[5]=mode;
	buf[6]=mode+2;
	buf[7]=0xee;
	if (!Trasmit(hCommDev,buf,8))
	{
		return false;
	}
	x=WaitFor(100,7,buf);
	if (CheckSum(x,buf))
	{
		*tag=buf[3];
		*(tag+1)=buf[4];
		return true;
	}
	else
		return false;
}


LOUExport bool WINAPI mif_anticoll(byte bcnt, byte * snr)
{
	byte buf[30];
	int x;
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x06;
	buf[4]=0x03;
	buf[5]=bcnt;
	buf[6]=snr[0];
	buf[7]=snr[1];
	buf[8]=snr[2];
	buf[9]=snr[3];
	buf[10]=snr[0]+snr[1]+snr[2]+snr[3]+0x03+bcnt;
	buf[11]=0xee;
	if (!Trasmit(hCommDev,buf,12))
	{
		return false;
	}
	x=WaitFor(100,9,buf);	
	if (CheckSum(x,buf))
	{
		snr[0]=buf[3];
		snr[1]=buf[4];
		snr[2]=buf[5];
		snr[3]=buf[6];
		return true;
	}
	else
		return false;
}

LOUExport bool WINAPI mif_select(byte *snr, byte * size)
{
	byte buf[30];
	int x;
	EscapeCommFunction(hCommDev,CLRRTS);
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x05;
	buf[4]=0x04;
	buf[5]=snr[0];
	buf[6]=snr[1];
	buf[7]=snr[2];
	buf[8]=snr[3];
	buf[9]=snr[0]+snr[1]+snr[2]+snr[3]+0x04;
	buf[10]=0xee;
	if (!Trasmit(hCommDev,buf,11))
	{
		return false;
	}
	x=WaitFor(100,6,buf);	
	if (CheckSum(x,buf))
	{
		*size=buf[3];
		return true;
	}
	else
		return false;
}

LOUExport bool WINAPI mif_loadkey(byte mode, byte key_addr, byte * newkey)
{
	byte buf[30];
	int x;
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x09;
	buf[4]=0x05;
	buf[5]=mode;
	buf[6]=key_addr;
	buf[7]=newkey[0];
	buf[8]=newkey[1];
	buf[9]=newkey[2];
	buf[10]=newkey[3];
	buf[11]=newkey[4];
	buf[12]=newkey[5];
	buf[13]=newkey[0]+newkey[1]+newkey[2]+newkey[3]+newkey[4]+newkey[5]+mode+key_addr+0x05;
	buf[14]=0xee;
	if (!Trasmit(hCommDev,buf,15))
	{
		return false;
	}
	x=WaitFor(100,5,buf);	
	if (buf[2]==0xad)
		return true;
	else
		return false;
}

LOUExport bool WINAPI mif_authentication(byte mode, byte sector_nr)
{
	byte buf[30];
	int x;
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x03;
	buf[4]=0x06;
	buf[5]=mode;
	buf[6]=sector_nr;
	buf[7]=mode+sector_nr+0x06;
	buf[8]=0xee;
	if (!Trasmit(hCommDev,buf,9))
	{
		return false;
	}
	x=WaitFor(100,5,buf);	
	if (buf[2]==0xad)
		return true;
	else
		return false;
}


LOUExport bool WINAPI mif_read(byte block_addr,byte * pData)
{
	byte buf[30];
	int x;
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x02;
	buf[4]=0x07;
	buf[5]=block_addr;
	buf[6]=0x07+block_addr;
	buf[7]=0xee;
	if (!Trasmit(hCommDev,buf,8))
	{
		return false;
	}
	x=WaitFor(100,21,buf);	
	if (CheckSum(x,buf))
	{
		for (int i=0;i<16;i++)
			pData[i]=buf[3+i];
		return true;
	}
	else
		return false;
}

LOUExport bool WINAPI mif_write(byte block_addr,byte * pData)
{
	byte buf[30];
	int x;
	byte sum;
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x12;
	buf[4]=0x08;
	sum=buf[5]=block_addr;
	for (x=0;x<16;x++)
	{
		buf[6+x]=pData[x];
		sum+=pData[x];
	}
	buf[22]=sum+0x08;
	buf[23]=0xee;
	if (!Trasmit(hCommDev,buf,24))
	{
		return false;
	}
	x=WaitFor(100,5,buf);	
	if (buf[2]==0xad)
		return true;
	else
		return false;
}

LOUExport bool WINAPI RewrTest(byte * data)
{
	byte buf[30];
	int x;
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x01;
	buf[4]=0x00;
	buf[5]=0x00;
	buf[6]=0xee;
	if (!Trasmit(hCommDev,buf,7))
	{
		return false;
	}
	x= WaitFor(100,26,data);
	if (x>1)
		return true;
	else
		return false;

}

LOUExport bool WINAPI mif_HL_authentication(byte mode, byte sector_nr)
{
	byte buf[30];
	int x;
	buf[0]=0xff;
	buf[1]=0xff;
	buf[2]=0xbb;
	buf[3]=0x03;
	buf[4]=0x0a;
	buf[5]=mode;
	buf[6]=sector_nr;
	buf[7]=mode+sector_nr+0x0a;
	buf[8]=0xee;
	if (!Trasmit(hCommDev,buf,9))
	{
		return false;
	}
	x=WaitFor(100,5,buf);	
	if (buf[2]==0xad)
		return true;
	else
		return false;
}

LOUExport bool WINAPI Password_Xor(byte * data)
{
	if (data==NULL)
		return false;
	data[0]^=0x19;
	data[1]^=0x76;
	data[2]^=0x01;
	return true;
}

⌨️ 快捷键说明

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