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

📄 comport.h

📁 vt100终端仿真程序
💻 H
字号:
// ComPort.h: interface for the CComPort class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_COMPORT_H__7FDA6FF5_5ED7_43DA_9400_D0B82D0BD36A__INCLUDED_)
#define AFX_COMPORT_H__7FDA6FF5_5ED7_43DA_9400_D0B82D0BD36A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "Communicate.h"
#include "cfgfile.h"
#include "logfile.h"

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

class CComPort : public CCommunicate  
{
public:
	int RcvData(char *pszDataBuf,DWORD *pdwLen);
	CComPort();
	virtual ~CComPort();

	virtual int InitCom()
	{
		//open port to host
		DCB dcb;
		BOOL blSetOk;
		TCHAR szPortName[10];
		int iBaudRate,iByteSize,iParity,iStopBit;
		CCfgFile csCfgFile;
		COMMTIMEOUTS CommTimeouts;

		if (m_pOwnerWnd==NULL){
			return 1;
		}
		
		if(m_blIsRcvThreadActive||m_blIsSndThreadActive)
			return 0;

		//set device type
		m_iDevType=0;
		
		//Get parameter from config file
		memset(szPortName,0,sizeof(szPortName));
		csCfgFile.GetCfgItemStr(PORTNAME,szPortName,10);
		iBaudRate=csCfgFile.GetCfgItemInt(BAUDRATE);
		iByteSize=csCfgFile.GetCfgItemInt(BYTESIZE);
		iParity=csCfgFile.GetCfgItemInt(PARITY);
		iStopBit=csCfgFile.GetCfgItemInt(STOPBIT);
		
		//initial Comm Port
		m_hCommHnd=CreateFile(szPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
	
		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.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));
		CommTimeouts.ReadIntervalTimeout=MAXDWORD;
		SetCommTimeouts(m_hCommHnd,&CommTimeouts);

		//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;
	}

	virtual int ResetCom()
	{
//		MSG message;
	
		//透明方式
		if(iComDev==0){
			//Send Stop signal to RcvThread
/*			if(m_hStopEvent!=NULL){
				SetEvent(m_hStopEvent);///触发事件
				while(m_blIsSndThreadActive==TRUE)
					if(::PeekMessage(&message,NULL,0,0,PM_REMOVE)){
						::TranslateMessage(&message);
						::DispatchMessage(&message);
					}
				CloseHandle(m_hStopEvent);
				m_hStopEvent=NULL;
			}
*/
			//close comm handle
			if(m_hCommHnd!=NULL){
				CloseHandle(m_hCommHnd);
				m_hCommHnd=NULL;
			}

			//kill RcvThread
			if(m_blIsRcvThreadActive){
				TerminateThread(m_pRcvThread, 0);
				m_blIsRcvThreadActive=FALSE;
			}
		}
		else{
			//close comm handle
			if(m_hCommHnd!=NULL){
				CloseHandle(m_hCommHnd);
				m_hCommHnd=NULL;
			}
		}
	
		return 0;
	}

	virtual int SendData(char *pszSendBuf,int iLen)
	{
		char szTemp[100];
		DWORD dwSendLen;

		memset(m_szSendBuf,0,sizeof(m_szSendBuf));
		memcpy(m_szSendBuf,pszSendBuf,iLen);
		m_dwSendLen=iLen;

		dwSendLen=0;
//		csLog.WriteLog(1, 1,m_szSendBuf,m_dwSendLen);					
		if(WriteFile(m_hCommHnd,m_szSendBuf,m_dwSendLen,&dwSendLen,NULL)){
			return 0;
		}
		else{
			sprintf(szTemp,"Snd Error, error code=%d",GetLastError());
//			csLog.WriteLog(1, 1,szTemp,0);
			return 1;
		}

//		SetEvent(m_hSendDataEvent);
		
//		return 0;
	}


	int InitCom(char *pszPortName); //for connect to aux 
	int InitCom(char *pszPortName,int iBaudRate,int iParity,int iByteSize,int iStopBit); //for aux
//	int RcvData(char *pszDataBuf,DWORD *pdwLen);

private:
	static	UINT RcvThread(LPVOID pParam);
	static	UINT SndThread(LPVOID pParam);

	HANDLE m_hCommHnd;
	int m_iDevType;		//device type 0:Terminal communication device
						//			  1:Aux Port communication device
};

#endif // !defined(AFX_COMPORT_H__7FDA6FF5_5ED7_43DA_9400_D0B82D0BD36A__INCLUDED_)

⌨️ 快捷键说明

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