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

📄 comport.cpp

📁 vt100终端仿真程序
💻 CPP
字号:
// ComPort.cpp: implementation of the CComPort class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "vt100.h"
#include "ComPort.h"
#include "cfgfile.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define WM_DATAARRIVAL (WM_USER+1)
#define WM_COMMERROR	(WM_USER+2)

//超时
#define TIMEOUT		10

//串口设备类型
extern int iComDev; // 0:透明方式 1:密码键盘 2:磁条读写器 3:打印机

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CComPort::CComPort()
{
	m_hCommHnd=NULL;
	m_dwOffset=0;
}

CComPort::~CComPort()
{

}

int CComPort::InitCom(char *pszPortName)
{	
	DCB dcb;
	BOOL blSetOk;
	int iBaudRate,iByteSize,iParity,iStopBit;
	CCfgFile csCfgFile;
	COMMTIMEOUTS CommTimeouts;
	int iPortNum;

	if (m_pOwnerWnd==NULL){
		return 1;
	}
	
	//获取串口设备类型
	iPortNum=pszPortName[3]-49;
	iComDev=csCfgFile.GetCfgItemInt(COM1DEV+iPortNum);
	
	//透明方式
	if(iComDev==0){
		if(m_blIsRcvThreadActive||m_blIsSndThreadActive)
			return 0;

		//set device type 
		m_iDevType=1;
	}

	//Get parameter from config file
	iBaudRate=csCfgFile.GetCfgItemInt(BAUDRATE);
	iByteSize=csCfgFile.GetCfgItemInt(BYTESIZE);
	iParity=csCfgFile.GetCfgItemInt(PARITY);
	iStopBit=csCfgFile.GetCfgItemInt(STOPBIT);

	//initial Comm Port
#ifdef UNICODE
	TCHAR wcPortName[10];

	mbstowcs(wcPortName,pszPortName,sizeof(wcPortName));
	m_hCommHnd=CreateFile(wcPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
#else
	m_hCommHnd=CreateFile(pszPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
#endif
	
	if(m_hCommHnd==INVALID_HANDLE_VALUE)
		return 2;

    blSetOk = GetCommState(m_hCommHnd,&dcb);
	if(!blSetOk) {
		CloseHandle(m_hCommHnd);
 		return 3;
	}

/*	dcb.BaudRate = iBaudRate;
	dcb.ByteSize = iByteSize;
	dcb.Parity = iParity;
	dcb.StopBits = iStopBit;
	dcb.fDtrControl = DTR_CONTROL_ENABLE;
*/
	dcb.BaudRate = 9600;
	dcb.ByteSize = 8;
	dcb.StopBits = 0;
	dcb.fDtrControl = DTR_CONTROL_ENABLE;
	dcb.fInX=0;
	dcb.fOutX=0; 

	if(iComDev==3){
		dcb.Parity = EVENPARITY;
		dcb.fNull=FALSE;
		dcb.fRtsControl=RTS_CONTROL_HANDSHAKE; 
	}
	else{
		dcb.Parity = NOPARITY;
		dcb.fNull=TRUE;
		dcb.fRtsControl=RTS_CONTROL_DISABLE; 
	}

	blSetOk=SetCommState(m_hCommHnd,&dcb);
	if(!blSetOk) {
		CloseHandle(m_hCommHnd);
		return 4;
	}

	//time out
	GetCommTimeouts(m_hCommHnd,&CommTimeouts);
	memset(&CommTimeouts,0,sizeof(CommTimeouts));
	if(iComDev==0){
		CommTimeouts.ReadIntervalTimeout=MAXDWORD;
	}
	else{
		CommTimeouts.ReadTotalTimeoutMultiplier= TIMEOUT;
		CommTimeouts.ReadTotalTimeoutConstant =TIMEOUT;
		CommTimeouts.ReadIntervalTimeout=TIMEOUT;
	}
	SetCommTimeouts(m_hCommHnd,&CommTimeouts);

	//透明方式
	if(iComDev==0){
	
		//create stop evnet 
/*		m_hStopEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

		//create send request event
		m_hSendDataEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
*/
		m_blIsRcvThreadActive=FALSE;
		m_blIsSndThreadActive=FALSE;

		//create Rcv thread
		DWORD dwRcvId;
		if((m_pRcvThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)RcvThread,this,0,&dwRcvId))==NULL){
			return 5;
		}

		//create Snd thread
/*		DWORD dwSndId;
		if(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SndThread,this,0,&dwSndId)==NULL){
			return 6;
		}
*/	
		//wait until started
		while(!m_blIsRcvThreadActive){
			Sleep(10);
		}
/*		while(!m_blIsSndThreadActive){
			Sleep(10);
		}
*/
	}

	return 0;
}

int CComPort::InitCom(char *pszPortName,int iBaudRate,int iParity,int iByteSize,int iStopBit)
{
	DCB dcb;
	BOOL blSetOk;
	CCfgFile csCfgFile;
	COMMTIMEOUTS CommTimeouts;
	int iPortNum;

	if (m_pOwnerWnd==NULL){
		return 1;
	}
	
	//获取串口设备类型
	iPortNum=pszPortName[3]-49;
	iComDev=csCfgFile.GetCfgItemInt(COM1DEV+iPortNum);
	
	//透明方式
	if(iComDev==0){
		if(m_blIsRcvThreadActive||m_blIsSndThreadActive)
			return 0;

		//set device type 
		m_iDevType=1;
	}

	//initial Comm Port
#ifdef UNICODE
	TCHAR wcPortName[10];

	mbstowcs(wcPortName,pszPortName,sizeof(wcPortName));
	m_hCommHnd=CreateFile(wcPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
#else
	m_hCommHnd=CreateFile(pszPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
#endif

	if(m_hCommHnd==INVALID_HANDLE_VALUE)
		return 2;

    blSetOk = GetCommState(m_hCommHnd,&dcb);
	if(!blSetOk) {
		CloseHandle(m_hCommHnd);
 		return 3;
	}

	dcb.BaudRate = iBaudRate;
	dcb.ByteSize = iByteSize;
//	dcb.Parity = iParity;
	dcb.StopBits = iStopBit;
	dcb.fDtrControl = DTR_CONTROL_ENABLE;
	dcb.fInX=0;
	dcb.fOutX=0; 

/*	dcb.BaudRate = 9600;
	dcb.ByteSize = 8;
	dcb.Parity = 0;
	dcb.StopBits = 0;
	dcb.fDtrControl = DTR_CONTROL_ENABLE;
	dcb.fInX=0;
	dcb.fOutX=0; 
*/
	//prt
	if(iComDev==3){
		dcb.Parity = EVENPARITY;
		dcb.fNull=FALSE;
		dcb.fRtsControl=RTS_CONTROL_HANDSHAKE; 
	}
	else{
		dcb.Parity = NOPARITY;
		dcb.fNull=TRUE;
		dcb.fRtsControl=RTS_CONTROL_DISABLE; 
	}

	blSetOk=SetCommState(m_hCommHnd,&dcb);
	if(!blSetOk) {
		CloseHandle(m_hCommHnd);
		return 4;
	}

	//time out
	GetCommTimeouts(m_hCommHnd,&CommTimeouts);
	memset(&CommTimeouts,0,sizeof(CommTimeouts));
	if(iComDev==0){
		CommTimeouts.ReadIntervalTimeout=MAXDWORD;
	}
	else{
		CommTimeouts.ReadTotalTimeoutMultiplier= TIMEOUT;
		CommTimeouts.ReadTotalTimeoutConstant =TIMEOUT;
		CommTimeouts.ReadIntervalTimeout=TIMEOUT;
	}
	SetCommTimeouts(m_hCommHnd,&CommTimeouts);

	//透明方式
	if(iComDev==0){

		//create stop evnet 
/*		m_hStopEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

		//create send request event
		m_hSendDataEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
*/
		m_blIsRcvThreadActive=FALSE;
		m_blIsSndThreadActive=FALSE;

		//create Rcv thread
		DWORD dwRcvId;
		if((m_pRcvThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)RcvThread,this,0,&dwRcvId))==NULL){
			return 5;
		}

		//create Snd thread
/*		DWORD dwSndId;
		if(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SndThread,this,0,&dwSndId)==NULL){
			return 6;
		}
*/	
		//wait until started
		while(!m_blIsRcvThreadActive){
			Sleep(10);
		}

/*		while(!m_blIsSndThreadActive){
			Sleep(10);
		}
*/
	}

	return 0;
}


UINT CComPort::RcvThread(LPVOID pParam)
{
	int iRetCode,iLoop;
	char szTemp[100];

	CCommunicate *pMyClass=(CCommunicate *)pParam;
	
	pMyClass->m_blIsRcvThreadActive=TRUE;

	iLoop=1;
	while(iLoop==1){
		memset(pMyClass->m_szDataBuf,0,sizeof(pMyClass->m_szDataBuf));
		iRetCode=ReadFile(((CComPort *)pMyClass)->m_hCommHnd,pMyClass->m_szDataBuf,1,&(pMyClass->m_dwLen),NULL);
		if(iRetCode<=0){	
			iRetCode=GetLastError();
			if(iRetCode!=6){
				sprintf(szTemp,"Rcv Error, error code=%d",iRetCode);
				csLog.WriteLog(0, ((CComPort *)pMyClass)->m_iDevType,szTemp,0);
				PostMessage(pMyClass->m_pOwnerWnd,WM_COMMERROR,((CComPort *)pMyClass)->m_iDevType,1);
			}
			break;
		}
		else{
			if(pMyClass->m_dwLen!=0){
				csLog.WriteLog(0,((CComPort *)pMyClass)->m_iDevType,pMyClass->m_szDataBuf, pMyClass->m_dwLen);
				SendMessage(pMyClass->m_pOwnerWnd,WM_DATAARRIVAL,((CComPort *)pMyClass)->m_iDevType,0);
			}
			else{
				Sleep(100);
			}
		}
	}
	
	pMyClass->m_blIsRcvThreadActive=FALSE;

	return 0;

}

UINT CComPort::SndThread(LPVOID pParam)
{
	HANDLE hEventGroup[3];
	int iRetCode,iLoop;
	DWORD dwSendLen;

	CCommunicate *pMyClass=(CCommunicate *)pParam;

	memset(hEventGroup,0,sizeof(HANDLE)*3);
	hEventGroup[0]=pMyClass->m_hSendDataEvent;
	hEventGroup[1]=pMyClass->m_hStopEvent;
	
	pMyClass->m_blIsSndThreadActive=TRUE;

	iLoop=1;
	while(iLoop==1){
		iRetCode=WaitForMultipleObjects(2,hEventGroup,FALSE,-1);
	
		switch(iRetCode){
		case WAIT_OBJECT_0:	//Send data request
			ResetEvent(hEventGroup[0]);
			iRetCode=WriteFile(((CComPort *)pMyClass)->m_hCommHnd,pMyClass->m_szSendBuf,pMyClass->m_dwSendLen,&dwSendLen,NULL);
			if(iRetCode<=0){
				PostMessage(pMyClass->m_pOwnerWnd,WM_COMMERROR,2,1);
				iLoop=0;
			}	
			break;
		
		case WAIT_OBJECT_0+1: //stop event
			ResetEvent(hEventGroup[1]);
			iLoop=0;
			break;

		default:
			PostMessage(pMyClass->m_pOwnerWnd,WM_COMMERROR,2,0);
			iLoop=0;
			break;
		}	
	}

	pMyClass->m_blIsSndThreadActive=FALSE;

	return 0;	
}

int CComPort::RcvData(char *pszDataBuf, DWORD *pdwLen)
{
	int iRetCode;
	char szTemp[100];

	iRetCode=ReadFile(m_hCommHnd,pszDataBuf,50,pdwLen,NULL);
	if(iRetCode==0||(*pdwLen==0)){
		sprintf(szTemp,"Rcv error,error code=%d",GetLastError());
		csLog.WriteLog(0,1,szTemp,0); 
		return 1;
	}

	csLog.WriteLog(0,1,pszDataBuf,*pdwLen); 
	
	return 0;
}

⌨️ 快捷键说明

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