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

📄 readdll.cpp

📁 RFID 读卡演示程序
💻 CPP
字号:
// ReadDLL.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "ReadDLL.h"
#include "ISO15693.h"
#include   <iostream.h> 
HANDLE m_hCom;

BOOL APIENTRY DllMain( HANDLE hModule, 
					  DWORD  ul_reason_for_call, 
					  LPVOID lpReserved
					  )
{
    switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	//	m_count=0;
		//printf("\nprocess attach of dll");
		break;
	case DLL_THREAD_ATTACH:
		//printf("\nthread attach of dll");
		break;
	case DLL_THREAD_DETACH:
	//	printf("\nthread detach of dll");
		break;
	case DLL_PROCESS_DETACH:
       //  m_count=0;
	//	printf("\nprocess detach of dll");
		break;
    }
    return TRUE;
}


int _stdcall SetCom(const char *m_sPort, int BaudRate, int Databit, char *parity, char *stopbit) 
{ 
  COMMTIMEOUTS TimeOuts;                ///串口输出时间 超时设置 
  DCB dcb;                       ///与端口匹配的设备   
  m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, 
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
    NULL); // 以重叠方式打开串口 
   if(m_hCom==INVALID_HANDLE_VALUE) 
  {  
    //AfxMessageBox("设置串口部分,串口打开失败");  /////重叠方式 异步通信(INVALID_HANDLE_VALUE)函数失败。 
    return 0x01; 
  }   
  SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);       //设置缓冲区 
  memset(&TimeOuts,0,sizeof(TimeOuts));   
  TimeOuts.ReadIntervalTimeout=MAXDWORD;      // 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作 
  TimeOuts.ReadTotalTimeoutMultiplier=0;      //读时间系数 
  TimeOuts.ReadTotalTimeoutConstant=0;      //读时间常量  
  TimeOuts.WriteTotalTimeoutMultiplier=50;    //总超时=时间系数*要求读/写的字符数+时间常量 
  TimeOuts.WriteTotalTimeoutConstant=2000;    //设置写超时以指定WriteComm成员函数中的                        
  SetCommTimeouts(m_hCom, &TimeOuts);      //GetOverlappedResult函数的等待时间*/ 
 

	if(!GetCommState(m_hCom, &dcb))        ////串口打开方式、端口、波特率 与端口匹配的设备 
  { 
   // AfxMessageBox("GetCommState Failed"); 
    return 0x02; 
  } 
   
  dcb.fParity=TRUE;             //允许奇偶校验     
  dcb.fBinary=TRUE; 
  if(parity=="NONE") 
    dcb.Parity=NOPARITY; 
  if(parity=="ODD") 
    dcb.Parity=ODDPARITY; 
  if(parity=="EVEN") 
    dcb.Parity=EVENPARITY; 
  if(stopbit=="1")//设置波特率 
    dcb.StopBits=ONESTOPBIT; 
  //if(stopbit=="0")//设置波特率 
  //  dcb.StopBits=NONESTOPBIT; 
  if(stopbit=="2")//设置波特率 
    dcb.StopBits=TWOSTOPBITS;               
  BOOL m_bEcho=FALSE;            /// 
  int m_nFlowCtrl=0; 
  BOOL m_bNewLine=FALSE;           /// 
  dcb.BaudRate=BaudRate;           // 波特率 
  dcb.ByteSize=Databit;           // 每字节位数   
  // 硬件流控制设置 
  dcb.fOutxCtsFlow=m_nFlowCtrl==1; 
  dcb.fRtsControl=m_nFlowCtrl==1  ?RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;   
  // XON/XOFF流控制设置(软件流控制!) 
  dcb.fInX=dcb.fOutX=m_nFlowCtrl==2; 
  dcb.XonChar=XON; 
  dcb.XoffChar=XOFF; 
  dcb.XonLim=50; 
  dcb.XoffLim=50;   
  if(SetCommState(m_hCom, &dcb))   
    
  {	  
	  return 0;     ////com的通讯口设置   
   


  }
  else 
  { 
    //AfxMessageBox("串口已打开,设置失败"); 
    return 0x03; 
  } 

} 

int _stdcall ReadCom(BYTE inbuff[], DWORD &nBytesRead, int ReadTime) 
{ 
  DWORD lrc;                 ///纵向冗余校验 
  DWORD endtime;              /////////jiesuo 
  static OVERLAPPED ol; 
  int ReadNumber=0;   
  int numCount=0 ;               //控制读取的数目 
  DWORD dwErrorMask,nToRead;  
  COMSTAT comstat;   
  ol.Offset=0;              ///相对文件开始的字节偏移量 
  ol.OffsetHigh=0;            ///开始传送数据的字节偏移量的高位字,管道和通信时调用进程可忽略。 
  ol.hEvent=NULL;             ///标识事件,数据传送完成时设为信号状态 
  ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);   
  endtime=GetTickCount()+ReadTime;//GetTickCount()取回系统开始至此所用的时间(毫秒) 
 // for(int i=0;i<2000;i++) 
 //   inbuff[i]=0;   
  Sleep(ReadTime); 
  ClearCommError(m_hCom,&dwErrorMask,&comstat); 
  nToRead=min(2000,comstat.cbInQue);  
  if(int(nToRead)<2) 
    goto Loop; 
  if(!ReadFile(m_hCom,inbuff,nToRead,&nBytesRead,&ol)) 
  {   
    if((lrc=GetLastError())==ERROR_IO_PENDING) 
    { 
      /////////////////// 
      endtime=GetTickCount()+ReadTime;//GetTickCount()取回系统开始至此所用的时间(毫秒) 
      while(!GetOverlappedResult(m_hCom,&ol,&nBytesRead,FALSE))//该函数取回重叠操作的结果 
      { 
        if(GetTickCount()>endtime) 
          break; 
      }   
    }     
  } 
  return 1;   
Loop: return 0; 
} 


int _stdcall WriteCom(BYTE Outbuff[], int size) 
{ 
  DWORD nBytesWrite,endtime,lrc; 
  static OVERLAPPED ol; 
  DWORD dwErrorMask,dwError; 
  COMSTAT comstat; 
  ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); 
  ol.Offset=0;        
  ol.OffsetHigh=0; 
  ol.hEvent=NULL;        ///标识事件,数据传送完成时,将它设为信号状态 
  ClearCommError(m_hCom,&dwErrorMask,&comstat); 
  if(!WriteFile(m_hCom,Outbuff,size,&nBytesWrite,&ol)) 
  { 
    if((lrc=GetLastError())==ERROR_IO_PENDING) 
    { 
      endtime=GetTickCount()+1000; 
      while(!GetOverlappedResult(m_hCom,&ol,&nBytesWrite,FALSE)) 
      {  
        dwError=GetLastError(); 
        if(GetTickCount()>endtime) 
        {   
          //AfxMessageBox("写串口时间过长,目前串口发送缓冲区中的数据数目为空"); 
          break; 
        } 
        if(dwError=ERROR_IO_INCOMPLETE) 
          continue;     //未完全读完时的正常返回结果 
        else 
        { 
          //  发生错误,尝试恢复! 
          ClearCommError(m_hCom,&dwError,&comstat); 
          break; 
        } 
      } 
    }    
  }   
  FlushFileBuffers(m_hCom); 
  PurgeComm(m_hCom,PURGE_TXCLEAR);         
 
  return 1; 
} 

int _stdcall CloseCom()
{
     if(m_hCom==INVALID_HANDLE_VALUE) 
  {  
    //AfxMessageBox("设置串口部分,串口打开失败");  /////重叠方式 异步通信(INVALID_HANDLE_VALUE)函数失败。 

     return 0x01; 
  }   
  else
  {
  
        if(CloseHandle(m_hCom)==true)
	  {
	     return 0;
	  }
	  else
	  {
	     return 3;
	  }
 
  }

}

⌨️ 快捷键说明

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