📄 serialport.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 + -