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

📄 serialport.cpp

📁 一个串口类
💻 CPP
字号:
#include "StdAfx.h"
#include ".\serialport.h"
#include "IbmsSerialPortApi.h"
#include "comm_exception.h"
#include <sstream>
using namespace C2217::StdLib;
#include <assert.h>

#pragma  warning(disable:4267)

namespace IBMS
{
CSerialPort::CSerialPort(int nPort, int nRate /*=9600*/, StopBits stopbits /*= StopBits::TwoStopBits */, 
		Parity parity /*= Parity::NoParity*/, BYTE bDataByte /*=8*/ , FlowControl fc /*= FlowControl::NoFlowControl */)
	:m_nPort(nPort), m_hSerialPort(NULL),m_nRate(nRate),m_fc(fc),m_stopbits(stopbits),m_dataByte(bDataByte),
m_parity(parity)
{
}

CSerialPort::~CSerialPort(void)
{
	Close();
}

void CSerialPort::Open()
{
	Close(); // Reopen the port

	m_hSerialPort = Ibms_OpenPort(m_nPort,m_nRate,CSerialPort::OnReceiveData, this,
		m_parity, m_dataByte, m_stopbits, m_fc);

	if(m_hSerialPort == NULL)
	{
		stringstream errorDesp;
		errorDesp << "Open port [" << m_nPort << "] Fail. " ;
		THROW_EX( errorDesp.str() );
	}

	for(PortObserverList::iterator iter = m_portObservers.begin(); iter != m_portObservers.end(); ++ iter )
	{
		(*iter)->OnSerialPortOpen(this);
	}
}

void CSerialPort::Close()
{
	if(m_hSerialPort!=NULL)
	{
		Ibms_Close(m_hSerialPort);

		for(PortObserverList::iterator iter = m_portObservers.begin(); iter != m_portObservers.end(); ++ iter )
		{
			(*iter)->OnSerialPortClose(this);
		}
	}	
}

void CSerialPort::OnReceiveData(byte *pData, size_t nDataLen)
{
	//You can rewrite  the function
	for(PortObserverList::iterator iter = m_portObservers.begin(); iter != m_portObservers.end(); ++ iter )
	{
		(*iter)->OnSerialPortReceive(this, pData,nDataLen);
	}
}

void CSerialPort::Send(const byte *pData, size_t nDataLen)
{
	assert(m_hSerialPort!=NULL);
	assert(pData!=NULL);
	
	if(!Ibms_SendData(m_hSerialPort, const_cast<byte *>(pData), nDataLen))
	{
		stringstream errorDesp;
		errorDesp << "Port [" << m_nPort << "] Send data  Fail. " ;
		THROW_EX( errorDesp.str() );
	}

	for(PortObserverList::iterator iter = m_portObservers.begin(); iter != m_portObservers.end(); ++ iter )
	{
		(*iter)->OnSerialPortSend(this, pData,nDataLen);
	}
}

void  CSerialPort::OnReceiveData(LPVOID pSender, void *pData, DWORD nDataLen)
{
	CSerialPort *pPort = static_cast< CSerialPort *> (pSender);
	pPort->OnReceiveData( static_cast<BYTE *>(pData) , nDataLen);
}

void  CSerialPort::AtachPortObserver(ISerialPortObserver  *pObserver)
{
	assert(pObserver!=NULL);
	m_portObservers.push_back(pObserver);
}

void  CSerialPort::DetchProtObserver(ISerialPortObserver *pObserver)
{
	assert(pObserver!=NULL);
	m_portObservers.remove(pObserver);
}

string CSerialPort::GetName() const
{
	stringstream name;
	name << " Port ["  << m_nPort << "]";
	return name.str();
}

bool operator==( const CSerialPort&  left,  const CSerialPort &right)
{
	if(left.GetPort()!=right.GetPort() || left.GetRate() != right.GetRate() || left.GetStopBits() != right.GetStopBits() )
	{
		return false;
	}

	if(left.GetDataBits() != right.GetDataBits() || left.GetFlowControl() !=right.GetFlowControl() || left.GetFlowControl() != right.GetFlowControl() )
	{
		return false;
	}

	return true;
}


}

⌨️ 快捷键说明

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