www.pudn.com > HPMapx.rar > SerialPort.cpp


 
#include "stdafx.h" 
#include "../HPMapx.h" 
#include "SerialPort.h" 
 
#include  
 
bool CCommCE::Open(COMM_SET &nCommSet,int nPort) 
{ 
	CloseComm();			 
	DWORD dwError; 
	 
	CString strPort; 
	strPort.Format(TEXT("COM%d:"),nPort==8? nCommSet.portnr: nPort);	 
	 
	m_hComm = CreateFile(strPort,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); 
	 
	if(m_hComm==INVALID_HANDLE_VALUE) 
	{ 
		dwError=::GetLastError(); 
		strErrorMessage = _T("CreateFileʧ°Ü"); 
		return false; 
	} 
	 
	COMMTIMEOUTS m_ctTimeOuts; 
	m_ctTimeOuts.ReadIntervalTimeout	= 1000; 
	m_ctTimeOuts.ReadTotalTimeoutMultiplier = 1000; 
	m_ctTimeOuts.ReadTotalTimeoutConstant	= 1000; 
	m_ctTimeOuts.WriteTotalTimeoutMultiplier= 1000; 
	m_ctTimeOuts.WriteTotalTimeoutConstant	= 1000; 
	 
	if(!SetCommTimeouts(m_hComm,&m_ctTimeOuts)) 
	{ 
		strErrorMessage = _T("SetCommTimeoutsʧ°Ü"); 
		return false; 
	} 
	 
	if(!SetCommMask(m_hComm,nCommSet.dwCommEvents)) 
	{ 
		strErrorMessage = _T("SetCommMaskʧ°Ü"); 
		return false; 
	} 
 
	hOwnerWnd = nCommSet.pPortOwner; 
	 
	DCB m_dcb; 
	if(!GetCommState(m_hComm,&m_dcb)) 
	{ 
		strErrorMessage = _T("GetCommStateʧ°Ü"); 
		return false; 
	} 
	m_dcb.BaudRate	= nCommSet.baud; 
	m_dcb.ByteSize	= nCommSet.databits; 
	m_dcb.Parity	= nCommSet.parity; 
	m_dcb.StopBits	= nCommSet.stopbits; 
	m_dcb.EvtChar	= 'q'; 
	m_dcb.fRtsControl = RTS_CONTROL_ENABLE;	 
	 
	if(!SetCommState(m_hComm,&m_dcb)) 
	{ 
		strErrorMessage = _T("SetCommStateʧ°Ü"); 
		return false; 
	} 
	 
	PurgeComm(m_hComm, 0x0000000F ); 
	return StartMonitor(); 
} 
 
bool CCommCE::StartMonitor() 
{ 
	if(m_iThreadFlag == CH_BEGIN) 
		return true; 
 
	if (!(m_Thread = AfxBeginThread(CommThread,this))) 
	{ 
		theApp.strRealTimeMsg = _T("³ÌÐò´íÎó£¬ÇëÖØÐ°²×°"); 
		::SendMessage( GetOwerWindow(),WM_RT_MESSAGE,0,0); 
		return false; 
	} 
 
	m_iThreadFlag = CH_BEGIN; 
	return true; 
} 
 
UINT CCommCE::CommThread(LPVOID pParam) 
{ 
	CCommCE* cPort = (CCommCE*)pParam; 
	 
	PurgeComm( cPort->m_hComm, 0x0000000F ); 
	 
	if(cPort->m_iThreadFlag == CH_BEGIN) 
	ReadData(cPort); 
 
	else 
	AfxEndThread(100); 
	 
	return 0; 
} 
 
void CCommCE::ReadData(CCommCE* nPort) 
{ 
	DWORD dwError = 0; 
	BYTE RXBuff; 
	DWORD BytesRead; 
 
	COMSTAT comstat; 
	ClearCommError(&nPort->m_hComm,&dwError,&comstat); 
 
	for(;;) 
	{ 
		if( !nPort->m_hComm || nPort->m_iThreadFlag != CH_BEGIN ) 
			return; 
 
		if( ReadFile(nPort->m_hComm,&RXBuff,1,&BytesRead,0) ) 
		::SendMessage( nPort->GetOwerWindow(), WM_COMM_RXCHAR, (WPARAM) RXBuff,(LPARAM)1); 
 
		Sleep(1); 
	} 
	return; 
}