www.pudn.com > HPMapx.rar > SerialPort.cpp
#include "stdafx.h" #include "../HPMapx.h" #include "SerialPort.h" #includebool 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; }