📄 comm.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 + -