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 + -
显示快捷键?