⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 portreader.cpp

📁 从串口读取
💻 CPP
字号:
#include "StdAfx.h"
#include "PortReader.h"

//##ModelId=3D1671240398
const long BUFFER_SIZE = 256;

CPortReader::CPortReader()
{
	m_bIsRun      = false;
	m_hPort       = INVALID_HANDLE_VALUE;
	m_hReadThread = NULL;
	dwThreadID = 0;
	m_bTrue = true;
	
}

CPortReader::~CPortReader()
{
}

bool CPortReader::ClosePort()
{
	if(INVALID_HANDLE_VALUE != m_hPort)
		CloseHandle(m_hPort);
	return true;
}

//##ModelId=3D1AC4910149
bool CPortReader::ReadPort(char* strBuffer, long& lSize)
{
	bool	retValue = true;
	long	iLoop = 0;
	long	count = 0;
	DWORD	dwReceived;
	BOOL    bPortEnd;
	DWORD errflag;
	COMSTAT commst;

	ClearCommError(m_hPort, &errflag, &commst);
	DWORD lenrev = (BUFFER_SIZE < commst.cbInQue) ? BUFFER_SIZE : commst.cbInQue;
	lSize = lenrev;

	memset(strBuffer, 0, lSize);
	bool    bRemove = true;
	//	MessageBox(NULL,LPCTSTR("Read!"),LPCTSTR("Now is reading!"),MB_OK);
	OVERLAPPED overlapped;
	overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL) ;
		if(!(bPortEnd = ReadFile (m_hPort, strBuffer, lenrev, &dwReceived, &overlapped)))
		{
			AfxMessageBox("Read port error");
			return false;
		}

	return TRUE;
}

//##ModelId=3D1AC4F901CB
DWORD WINAPI ReadPortProc(LPVOID pParam)
{	
	CPortReader*		pReader;
	DWORD				dwCommStatus;
	HANDLE				hPort;
	pReader      = (CPortReader*)pParam;
	hPort        = pReader->m_hPort;

	if((NULL == pReader)||(INVALID_HANDLE_VALUE == hPort))
		return 0L;
	
	char pszBuffer[256];
	long  lReadSize;		
	SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_BREAK);
	while (pReader->m_bTrue) 
	{
		WaitCommEvent(hPort, &dwCommStatus, NULL);
		SetCommMask(hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RING | EV_BREAK);
		if(dwCommStatus & EV_RXCHAR)
		{
			lReadSize  = BUFFER_SIZE;
			memset(pszBuffer, 0, BUFFER_SIZE);
			pReader->ReadPort((char*)pszBuffer, lReadSize);

			AfxMessageBox(pszBuffer);
		}		
	}	
	return 0L;	
}

bool CPortReader::SuspendGPS()
{
	return(0 != SetCommBreak(m_hPort));
}

bool CPortReader::Open(string strDevice)
{	
	DCB             portDCB;
	COMMTIMEOUTS	CommTimeouts;
	bool            retValue = false;
	int             iLoop;
	
	for(iLoop = 0; iLoop < 1; iLoop++)
	{
		string strTmp = strDevice.substr(0, 3);
		if(0 != strTmp.compare("COM"))
			break;
		m_strPort.assign(strDevice);	
		char lpszPortName[6];
		memset(lpszPortName, 0, sizeof(char)*6);
		strcpy(lpszPortName, m_strPort.c_str());
		m_hPort = CreateFile(lpszPortName,
			GENERIC_READ|GENERIC_WRITE,
			0,						
			NULL,        
			OPEN_EXISTING,
			FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL,           
			NULL);        
		if(INVALID_HANDLE_VALUE == m_hPort)			
		{
			AfxMessageBox("Can't open COM2!");
			break;
		}
		if(!SetupComm(m_hPort, BUFFER_SIZE, BUFFER_SIZE))
			break;
		if(!PurgeComm(m_hPort, PURGE_RXCLEAR))
			break;
		portDCB.DCBlength = sizeof(DCB);
		GetCommState(m_hPort, &portDCB);
		{
			portDCB.BaudRate        = 9600;
			portDCB.ByteSize        = 8;
			portDCB.Parity          = NOPARITY;
			portDCB.StopBits        = ONESTOPBIT;
			portDCB.fDtrControl     = DTR_CONTROL_ENABLE;
			portDCB.fRtsControl     = RTS_CONTROL_ENABLE;
			portDCB.fBinary         = TRUE;
			portDCB.fDsrSensitivity = TRUE;
			portDCB.XonChar         = 0x10;
			portDCB.XoffChar        = 0x03;		
		}
		if(!SetCommState(m_hPort, &portDCB))
			break;
		GetCommTimeouts(m_hPort, &CommTimeouts);
		CommTimeouts.ReadIntervalTimeout			= MAXDWORD;
		CommTimeouts.ReadTotalTimeoutConstant		= 0;
		CommTimeouts.ReadTotalTimeoutMultiplier		= 0;
		CommTimeouts.WriteTotalTimeoutConstant      = 1000;
		CommTimeouts.WriteTotalTimeoutMultiplier	= 10;
		if(!SetCommTimeouts(m_hPort, &CommTimeouts))
			break;
		EscapeCommFunction (m_hPort, SETDTR);
		EscapeCommFunction (m_hPort, SETRTS);
		retValue = true;
	}
	if(!retValue)
	{
		if(INVALID_HANDLE_VALUE != m_hPort)
		{
			CloseHandle(m_hPort);
			m_hPort = INVALID_HANDLE_VALUE;
		}
	}

	m_hReadThread = CreateThread(NULL, 0, ReadPortProc, LPVOID(this), 0, 0);
	
	return retValue;
}

bool CPortReader::GetDeviceStatus()
{
	return m_bIsRun;
}




⌨️ 快捷键说明

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