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

📄 comm.cpp

📁  ?  plc 与上位机通信接口 帮助有需要的人
💻 CPP
字号:
// Comm.cpp: implementation of the CComm class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Comm.h"

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

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

CComm::CComm()
{
	m_hComm = INVALID_HANDLE_VALUE;
	::InitializeCriticalSection(&csComBuffer);
}

CComm::~CComm()
{
	if (INVALID_HANDLE_VALUE != m_hComm)
	{
		CloseHandle(m_hComm);
		m_hComm = INVALID_HANDLE_VALUE;
		DeleteCriticalSection(&csComBuffer);
	}
	
}

int CComm::vSetCommParam(int portid, int baudrate, int parity, int stopbits, int bytesize)
{
	this->m_iPortID = portid;
	this->m_iBaudRate = baudrate;
	this->m_iBytesize = bytesize;
	this->m_iParity = parity;
	this->m_iStopBits = stopbits;
	return SUCCESS;
}

int CComm::InitComm()
{
	HANDLE		l_hComm; 
	DCB			l_dcb;
	COMMPROP	l_commprop;
    CString     l_lpszCommName;

	//del pDataLog->vSetFlag(LOG_ON);//2002-12-25
	//del if(!pDataLog->OpenLog())
		//del pDataLog->vSetFlag(LOG_OFF);//2002-12-25;

	if(INVALID_HANDLE_VALUE != m_hComm)
	{
		CloseComm();
	}

	l_lpszCommName.Format( "\\\\.\\COM%d", m_iPortID );

	if (	(l_hComm	=	CreateFile(	l_lpszCommName,
										GENERIC_READ|GENERIC_WRITE, 
										0, 
										NULL, 
										OPEN_EXISTING, 
										0, 
										NULL)	) 
			== INVALID_HANDLE_VALUE		) 
		return	FAIL;
	GetCommProperties( l_hComm, &l_commprop );
	GetCommState( l_hComm, &l_dcb );
	
	if(	!(l_commprop.dwSettableBaud  &	m_iBaudRate )	)
	{
		CloseHandle(  l_hComm );       		
		m_hComm = INVALID_HANDLE_VALUE;
		return	FAIL;
	}

	l_dcb.BaudRate    = m_iBaudRate;	
	l_dcb.fParity     = 1;//TRUE
	l_dcb.fOutX       = FALSE;
	l_dcb.fInX        = FALSE;
	l_dcb.fRtsControl = RTS_CONTROL_ENABLE;
	l_dcb.fDtrControl = DTR_CONTROL_ENABLE;
	l_dcb.ByteSize    = (BYTE) m_iBytesize;
	l_dcb.Parity      = (BYTE) m_iParity;
	l_dcb.StopBits    = (BYTE) m_iStopBits;
	l_dcb.EvtChar	  = 0x02;
	SetCommState(	l_hComm,	&l_dcb	);

	if(!SetupComm(l_hComm, 1024, 1024))
	{
		CloseHandle(l_hComm);
		m_hComm = INVALID_HANDLE_VALUE;
		return FAIL;
	}
    PurgeComm( l_hComm,	PURGE_RXCLEAR  );  
	PurgeComm( l_hComm,	PURGE_TXCLEAR  );  
	
	m_hComm = l_hComm;

	return SUCCESS;
}

int CComm::GetCommInfo(DCB &dcb, int &iPortId)
{
	if (INVALID_HANDLE_VALUE != m_hComm)
	{
		iPortId = m_iPortID;
		GetCommState(m_hComm, &dcb);
		return SUCCESS;
	}
	return FAIL;
}

int CComm::CloseComm()
{
	if (INVALID_HANDLE_VALUE != m_hComm)
	{
		CloseHandle( m_hComm );
		m_hComm = INVALID_HANDLE_VALUE;
		DeleteCriticalSection(&csComBuffer);
		return SUCCESS;
	}
	else
		return FAIL;
}


int CComm::WritePort(BYTE *pBuf, UINT uLength, int msTimeOut)
{
	if(m_hComm == INVALID_HANDLE_VALUE)
	{
		return FAIL;//2001.11	COM not opened
	}
	unsigned long	n = uLength;
	BYTE	 Cmd[512];

    memset(&Cmd,0X00,sizeof(Cmd));
	for(int i=0;i<=(int)uLength-1;i++)
	{
		Cmd[i]=pBuf[i];
	}

	SetRWTimeout(-1, -1, -1, -1, msTimeOut);
	//SetRWTimeout(1, 0, 1, 0, 1);
	PurgeComm( this->m_hComm, PURGE_RXCLEAR );
	PurgeComm( this->m_hComm, PURGE_TXCLEAR );
	::EnterCriticalSection(&csComBuffer);
	WriteFile( m_hComm, Cmd, uLength, &n, NULL );
	::LeaveCriticalSection(&csComBuffer);

	if( n < (unsigned long)uLength )
		return FAIL;
	else

		return SUCCESS;
}

int CComm::ReadPort( BYTE *pBuf, int &iLength, int msTimeOut )
{

	if(m_hComm == INVALID_HANDLE_VALUE)
		return FAIL;

	UINT	TimeOut = msTimeOut;
	unsigned long n = 0;
/*
	if(msTimeOut < 100 )
	{
		TimeOut = 100;
	}
	*/
	SetRWTimeout(0,0,TimeOut,-1,-1);

	::EnterCriticalSection(&csComBuffer);
	
	ReadFile(m_hComm, pBuf, iLength, &n, NULL);

	::LeaveCriticalSection(&csComBuffer);
	PurgeComm( this->m_hComm, PURGE_TXCLEAR );
	PurgeComm( this->m_hComm, PURGE_RXCLEAR );
	if(n < 1)		return FAIL;
	iLength = n;
	/*2006-2-7
	if(n < (unsigned long)iLength)
	{
		iLength = n;
		return	FAIL;
	}
	*/

	return SUCCESS;
}

BOOL CComm::SetRWTimeout(int msRITO, int msRTTOM, int msRTTOC, int msWTTOM, int msWTTOC)
{
	if(m_hComm == INVALID_HANDLE_VALUE)
		return FALSE;
	COMMTIMEOUTS TimeOut;
	if(!GetCommTimeouts(m_hComm,&TimeOut))
		return FALSE;
	if(msRITO>=0)
		TimeOut.ReadIntervalTimeout=msRITO;
	if(msRTTOM>=0)
		TimeOut.ReadTotalTimeoutMultiplier=msRTTOM;
	if(msRTTOC>=0)
		TimeOut.ReadTotalTimeoutConstant=msRTTOC;
	if(msWTTOM>=0)
		TimeOut.WriteTotalTimeoutMultiplier=msWTTOM;
	if(msWTTOC>=0)
		TimeOut.WriteTotalTimeoutConstant=msWTTOC;
	if(!SetCommTimeouts(m_hComm,&TimeOut))
		return FALSE;
	return TRUE;
}

⌨️ 快捷键说明

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