serialport.cpp

来自「一个mapxmobile+gps的小程序,需要先安装mapx mobile」· C++ 代码 · 共 126 行

CPP
126
字号

#include "stdafx.h"
#include "../HPMapx.h"
#include "SerialPort.h"

#include <assert.h>

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





⌨️ 快捷键说明

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