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

📄 comm.cpp

📁 读RF卡的源代码
💻 CPP
字号:
#include "stdafx.h"
#include "comm.h"

CRS232::CRS232()
{
	m_pCallBackFunc=NULL;
	memset(&m_osWrite,0,sizeof(OVERLAPPED));
	memset(&m_osRead, 0,sizeof(OVERLAPPED));
    m_bConnected=FALSE;
	m_pThread=NULL;
	m_hThreadTerm=CreateEvent(NULL,FALSE,FALSE,NULL);
	m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
}
CRS232::~CRS232()
{
	if(m_bConnected)
		CloseConnection();
	CloseHandle(m_hThreadTerm);
	CloseHandle(m_osRead.hEvent);
	CloseHandle(m_osWrite.hEvent);
}
int CRS232::OpenConnect(LPCTSTR szComPort,DWORD dwBaudRate,BYTE cByteSize,BYTE cStopBit,BYTE cParity)
{
	COMMTIMEOUTS  CommTimeOuts ;
	if(m_bConnected)
		return 0;
	SetEvent(m_osWrite.hEvent);
	m_hComDev=CreateFile(szComPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
	if(m_hComDev==INVALID_HANDLE_VALUE)
		return -1;//e_OpenComm;
	DCB dcb;
	dcb.DCBlength =sizeof(DCB);
	GetCommState(m_hComDev,&dcb);
	dcb.BaudRate = dwBaudRate;
    dcb.ByteSize = cByteSize;
    dcb.Parity =  cParity;
    dcb.StopBits = cStopBit;
	if(SetCommState(m_hComDev,&dcb)){
		SetCommMask(m_hComDev,EV_RXCHAR);
		SetupComm(m_hComDev,RXQUEUE,TXQUEUE);
		PurgeComm( m_hComDev, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
		
		CommTimeOuts.ReadIntervalTimeout = MAXDWORD ;
        CommTimeOuts.ReadTotalTimeoutMultiplier = MAXDWORD;
        CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
      
	    CommTimeOuts.WriteTotalTimeoutMultiplier = MAXDWORD;
        CommTimeOuts.WriteTotalTimeoutConstant = 1000;
        SetCommTimeouts( m_hComDev, &CommTimeOuts ) ;
		m_bConnected=TRUE;
		if(m_pThread=AfxBeginThread(CommWatchThreadProc,(LPVOID)this)){
			EscapeCommFunction(m_hComDev,SETDTR);
			return 0;
		}
	}
	m_bConnected=FALSE;
	CloseHandle(m_hComDev);
	return -2;//e_InitializeComm;
}
UINT CRS232::CommWatchThreadProc(LPVOID pParam)
{
	CRS232 *pRS232=(CRS232 *)pParam;
	DWORD dwEvtMask;
	HANDLE aEvent[2];
	OVERLAPPED os;
	int nLength;
	char abIn[MAXBLOCK+1];

	memset(&os,0,sizeof(OVERLAPPED));
	os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	aEvent[0]=os.hEvent;
	aEvent[1]=pRS232->m_hThreadTerm;

	while(pRS232->m_bConnected){
		WaitCommEvent(pRS232->m_hComDev,&dwEvtMask,&os);
		if(WaitForMultipleObjects(2,aEvent,FALSE,INFINITE)==WAIT_OBJECT_0){
			if((dwEvtMask &EV_RXCHAR)==EV_RXCHAR)
				do{
					if((nLength=pRS232->ReadCommBlock(abIn,MAXBLOCK))&&pRS232->m_pCallBackFunc){
						abIn[nLength]=0;
						(*pRS232->m_pCallBackFunc)(abIn,nLength,pRS232->m_pCallBackParam);
					}
				}while(nLength>0);
		}
	}
	CloseHandle(os.hEvent);
	return 0;
}
int CRS232::ReadCommBlock(LPSTR lpszBlock,int nMaxLength)
{
	COMSTAT ComStat;
	DWORD dwLength,dwErrorFlags;
	ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
	dwLength=min((DWORD)nMaxLength,ComStat.cbInQue);
	if(dwLength>0){
		if(!ReadFile(m_hComDev,lpszBlock,dwLength,&dwLength,&m_osRead))
			if(GetLastError()==ERROR_IO_PENDING)
				if(!GetOverlappedResult(m_hComDev,&m_osRead,&dwLength,TRUE))
					ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
				return dwLength;
				}
	return 0;
}
BOOL CRS232::CloseConnection()
{
	if(!m_bConnected)
		return FALSE;
	SetEvent(m_hThreadTerm);
	m_bConnected=FALSE;
	SetCommMask(m_hComDev,0);
	WaitForSingleObject(m_pThread->m_hThread,INFINITE);

	//EscapeCommFunction(m_hComDev,CLRDTR);
	CloseHandle(m_hComDev);
	return TRUE;
}
void WINAPI MyRS232CallBackFunc(LPCTSTR szDataBuf,int nDataLen,LPVOID pParam)
{
	for(int i=0;i<nDataLen;i++)
	{
		printf("%d\t",nDataLen);
		printf("%02x\t",szDataBuf[i]);
	}
	printf("\n");
}

⌨️ 快捷键说明

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