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

📄 apexcommctl.cpp

📁 提供串口通讯参数设置接口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////
// 文件: ApexCommCtl.cpp
// 功能: 控件功能实现文件,实现控件属性的改变和方法的功能
// 作者: 王念峰
// 日期: 1999.04.19 - 创建
//       1999.05.15 - 修改,整理
// E_mai:wnf@wisepeak.com
// Http://www.wisepeak.com
///////////////////////////////////////////////////////////////
// 版本: 1.0
///////////////////////////////////////////////////////////////
// 注:由于涉及串口通讯,要求系统必须同时响应串口事件和用户输入,
//    所以该处使用多线程来实现
///////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ApexComm.h"
#include "ApexCommCtl.h"
#include "vcthread.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


IMPLEMENT_DYNCREATE(CApexCommCtrl, COleControl)


/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CApexCommCtrl, COleControl)
	//{{AFX_MSG_MAP(CApexCommCtrl)
	ON_WM_WINDOWPOSCHANGING()
	//}}AFX_MSG_MAP
   
   //自定义消息映射,包括串口读到数据事件,串口挂起事件
   //                接收数据出错事件,数据传输完毕事件
   afx_msg ON_THREAD_MESSAGE(USER_RECEIVEDATA,ReceiveData)
   afx_msg ON_THREAD_MESSAGE(USER_ONCOMMHANGUP,CommHangup)
   afx_msg ON_THREAD_MESSAGE(USER_RECEIVEDATAERROR,ReceiveDataError)
   afx_msg ON_THREAD_MESSAGE(USER_DATASENDFINISHED,DataSendFinished)

END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
BEGIN_DISPATCH_MAP(CApexCommCtrl, COleControl)
	//{{AFX_DISPATCH_MAP(CApexCommCtrl)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "PortID", m_portID, OnPortIDChanged, VT_BSTR)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "BaudRate", m_baudRate, OnBaudRateChanged, VT_I4)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "EnableParity", m_enableParity, OnEnableParityChanged, VT_BOOL)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "OutxCtsFlow", m_outxCtsFlow, OnOutxCtsFlowChanged, VT_BOOL)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "OutxDsrFlow", m_outxDsrFlow, OnOutxDsrFlowChanged, VT_BOOL)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "DtrControl", m_dtrControl, OnDtrControlChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "DsrSensitivity", m_dsrSensitivity, OnDsrSensitivityChanged, VT_BOOL)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "TxContinueOnXoff", m_txContinueOnXoff, OnTxContinueOnXoffChanged, VT_BOOL)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "OutxXonXoffFlow", m_outxXonXoffFlow, OnOutxXonXoffFlowChanged, VT_BOOL)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "InxXonXoffFlow", m_inxXonXoffFlow, OnInxXonXoffFlowChanged, VT_BOOL)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReplaceWhenParityError", m_replaceWhenParityError, OnReplaceWhenParityErrorChanged, VT_BOOL)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "IgnoreNullChar", m_ignoreNullChar, OnIgnoreNullCharChanged, VT_BOOL)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "RtsControl", m_rtsControl, OnRtsControlChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "XonLimit", m_xonLimit, OnXonLimitChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "XoffLimit", m_xoffLimit, OnXoffLimitChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ByteSize", m_byteSize, OnByteSizeChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "Parity", m_parity, OnParityChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "StopBits", m_stopBits, OnStopBitsChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "XonChar", m_xonChar, OnXonCharChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "XoffChar", m_xoffChar, OnXoffCharChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReplaceChar", m_replaceChar, OnReplacedCharChanged, VT_I2)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "InputBufferSize", m_inputBufferSize, OnInputBufferSizeChanged, VT_I4)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "OutputBufferSize", m_outputBufferSize, OnOutputBufferSizeChanged, VT_I4)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReadIntervalTimeout", m_readIntervalTimeout, OnReadIntervalTimeoutChanged, VT_I4)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReadTotalTimeoutMultiplier", m_readTotalTimeoutMultiplier, OnReadTotalTimeoutMultiplierChanged, VT_I4)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReadTotalTimeoutConstant", m_readTotalTimeoutConstant, OnReadTotalTimeoutConstantChanged, VT_I4)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "WriteTotalTimeoutMultiplier", m_writeTotalTimeoutMultiplier, OnWriteTotalTimeoutMultiplierChanged, VT_I4)
	DISP_PROPERTY_NOTIFY(CApexCommCtrl, "WriteTotalTimeoutConstant", m_writeTotalTimeoutConstant, OnWriteTotalTimeoutConstantChanged, VT_I4)
	DISP_FUNCTION(CApexCommCtrl, "OpenPort", OpenPort, VT_EMPTY, VTS_NONE)
	DISP_FUNCTION(CApexCommCtrl, "ClosePort", ClosePort, VT_EMPTY, VTS_NONE)
	DISP_FUNCTION(CApexCommCtrl, "WritePort", WritePort, VT_BOOL, VTS_BSTR VTS_I4)
	//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()


/////////////////////////////////////////////////////////////////////////////
BEGIN_EVENT_MAP(CApexCommCtrl, COleControl)
	//{{AFX_EVENT_MAP(CApexCommCtrl)
	EVENT_CUSTOM("OnReceiveData", FireOnReceiveData, VTS_BSTR  VTS_I4)
	EVENT_CUSTOM("OnCommHangup", FireOnCommHangup, VTS_BOOL)
	EVENT_CUSTOM("ReceiveDateError", FireReceiveDateError, VTS_I4)
	EVENT_CUSTOM("DataSendFinished", FireDataSendFinished, VTS_NONE)
	//}}AFX_EVENT_MAP
END_EVENT_MAP()

/////////////////////////////////////////////////////////////////////////////
//由此向下不要修改,由系统维护
IMPLEMENT_OLECREATE_EX(CApexCommCtrl, "APEXCOMM.ApexCommCtrl.1",
	0xf0a2bec8, 0xf8b2, 0x11d2, 0x8a, 0x54, 0, 0x80, 0xc8, 0xeb, 0x2f, 0xfe)

/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_OLETYPELIB(CApexCommCtrl, _tlid, _wVerMajor, _wVerMinor)

/////////////////////////////////////////////////////////////////////////////
const IID BASED_CODE IID_DApexComm =
		{ 0xf0a2bec6, 0xf8b2, 0x11d2, { 0x8a, 0x54, 0, 0x80, 0xc8, 0xeb, 0x2f, 0xfe } };
const IID BASED_CODE IID_DApexCommEvents =
		{ 0xf0a2bec7, 0xf8b2, 0x11d2, { 0x8a, 0x54, 0, 0x80, 0xc8, 0xeb, 0x2f, 0xfe } };

/////////////////////////////////////////////////////////////////////////////
static const DWORD BASED_CODE _dwApexCommOleMisc =
	OLEMISC_ACTIVATEWHENVISIBLE |
	OLEMISC_SETCLIENTSITEFIRST |
	OLEMISC_INSIDEOUT |
	OLEMISC_CANTLINKINSIDE;// |
   //OLEMISC_INVISIBLEATRUNTIME;
	//OLEMISC_RECOMPOSEONRESIZE;

IMPLEMENT_OLECTLTYPE(CApexCommCtrl, IDS_APEXCOMM, _dwApexCommOleMisc)

/////////////////////////////////////////////////////////////////////////////
// CApexCommCtrl::CApexCommCtrlFactory::UpdateRegistry -
BOOL CApexCommCtrl::CApexCommCtrlFactory::UpdateRegistry(BOOL bRegister)
{
	// TODO: Verify that your control follows apartment-model threading rules.
	// Refer to MFC TechNote 64 for more information.
	// If your control does not conform to the apartment-model rules, then
	// you must modify the code below, changing the 6th parameter from
	// afxRegApartmentThreading to 0.

	if (bRegister)
		return AfxOleRegisterControlClass(
			AfxGetInstanceHandle(),
			m_clsid,
			m_lpszProgID,
			IDS_APEXCOMM,
			IDB_APEXCOMM,
			afxRegApartmentThreading,
			_dwApexCommOleMisc,
			_tlid,
			_wVerMajor,
			_wVerMinor);
	else
		return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
//以上代码不必修改
////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
//构造函数
CApexCommCtrl::CApexCommCtrl()
{
	InitializeIIDs(&IID_DApexComm, &IID_DApexCommEvents);
   SetInitialSize(24,24);//设置控件初始大小

   m_portID="COM1";
   m_hCommFile=NULL;
   m_bSendDataEmpty=true;
}


/////////////////////////////////////////////////////////////////////////////
CApexCommCtrl::~CApexCommCtrl()
{
	// TODO: Cleanup your control's instance data here.
}

/////////////////////////////////////////////////////////////////////////////
//显示设计状态下的控件外观
/////////////////////////////////////////////////////////////////////////////
void CApexCommCtrl::OnDraw(
			CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
	CBitmap bitmap;
	BITMAP  bmp;
	CPictureHolder picHolder;
	CRect rcSrcBounds;

	//装入位图
	bitmap.LoadBitmap(IDB_APEX);
	bitmap.GetObject(sizeof(BITMAP), &bmp);
	rcSrcBounds.right = bmp.bmWidth;
	rcSrcBounds.bottom = bmp.bmHeight;

	//创建位图并拉伸
	picHolder.CreateFromBitmap((HBITMAP)bitmap.m_hObject, NULL, false);
	picHolder.Render(pdc, rcBounds, rcSrcBounds);
}

/////////////////////////////////////////////////////////////////////////////
void CApexCommCtrl::DoPropExchange(CPropExchange* pPX)
{
	ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
	COleControl::DoPropExchange(pPX);

	PX_Long(pPX, _T("BaudRate"), m_baudRate, 9600);
   PX_Bool(pPX, _T("EnableParity"), m_enableParity, FALSE);
   PX_Bool(pPX, _T("OutxCtsFlow"), m_outxCtsFlow, FALSE);
   PX_Bool(pPX, _T("OutxDsrFlow"), m_outxDsrFlow, FALSE);
   PX_Short(pPX, _T("DtrControl"), m_dtrControl, 0);
   PX_Bool(pPX, _T("DsrSensitivity"), m_dsrSensitivity, FALSE);
   PX_Bool(pPX, _T("TxContinueOnXoff"), m_txContinueOnXoff, TRUE);
   PX_Bool(pPX, _T("OutxXonXoffFlow"), m_outxXonXoffFlow, FALSE);
   PX_Bool(pPX, _T("InxXonXoffFlow"), m_inxXonXoffFlow, FALSE);
   PX_Bool(pPX, _T("ReplaceWhenParityError"), m_replaceWhenParityError, FALSE);
   PX_Bool(pPX, _T("IgnoreNullChar"), m_ignoreNullChar, FALSE);
   PX_Short(pPX, _T("RtsControl"), m_rtsControl, 0);
   PX_Short(pPX, _T("XonLimit"), m_xonLimit, 200);
   PX_Short(pPX, _T("XoffLimit"), m_xoffLimit, 200);
   PX_Short(pPX, _T("ByteSize"), m_byteSize, 3);
   PX_Short(pPX, _T("Parity"), m_parity, 0);
   PX_Short(pPX, _T("StopBits"), m_stopBits, 0);
   PX_Short(pPX, _T("XonChar"), m_xonChar, 17);
   PX_Short(pPX, _T("XoffChar"), m_xoffChar, 19);
   PX_Short(pPX, _T("ReplaceChar"), m_replaceChar, 63);
   PX_Long(pPX, _T("InputBufferSize"), m_inputBufferSize, 2048);
   PX_Long(pPX, _T("OutputBufferSize"), m_outputBufferSize, 1024);
   PX_Long(pPX, _T("ReadIntervalTimeout"), m_readIntervalTimeout, 100);
   PX_Long(pPX, _T("ReadTotalTimeoutMultiplier"), m_readTotalTimeoutMultiplier, 0);
   PX_Long(pPX, _T("ReadTotalTimeoutConstant"), m_readTotalTimeoutConstant, 0);
   PX_Long(pPX, _T("WriteTotalTimeoutMultiplier"), m_writeTotalTimeoutMultiplier, 0);
   PX_Long(pPX, _T("WriteTotalTimeoutConstant"), m_writeTotalTimeoutConstant, 0);
	// TODO: Call PX_ functions for each persistent custom property.
}


/////////////////////////////////////////////////////////////////////////////
void CApexCommCtrl::OnResetState()
{
	COleControl::OnResetState();  // Resets defaults found in DoPropExchange
}


/////////////////////////////////////////////////////////////////////////////
//改变控件的属性
/////////////////////////////////////////////////////////////////////////////
void CApexCommCtrl::OnPortIDChanged() 
{
   if (m_hCommFile != NULL) return;
	SetModifiedFlag();
}

void CApexCommCtrl::OnBaudRateChanged() 
{
   if (m_baudRate<110) m_baudRate=110;

   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnEnableParityChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

   SetModifiedFlag();
}

void CApexCommCtrl::OnOutxCtsFlowChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnOutxDsrFlowChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnDtrControlChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnDsrSensitivityChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnTxContinueOnXoffChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnOutxXonXoffFlowChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnInxXonXoffFlowChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

   SetModifiedFlag();
}

void CApexCommCtrl::OnReplaceWhenParityErrorChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnIgnoreNullCharChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnRtsControlChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnXonLimitChanged() 
{
   if (m_xonLimit<=0) 
      m_xonLimit=1;
   else
      if (m_xonLimit>m_outputBufferSize) m_xonLimit=(short) m_outputBufferSize;

   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnXoffLimitChanged() 
{
   if (m_xoffLimit<= 0) 
      m_xoffLimit=1;
   else
      if (m_xoffLimit>m_inputBufferSize) m_xoffLimit=(short)m_inputBufferSize;
   
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnByteSizeChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnParityChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnStopBitsChanged() 
{
   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnXonCharChanged() 
{
   if (m_xonChar<0 || m_xonChar>127) m_xoffChar=17;

   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnXoffCharChanged() 
{
   if (m_xoffChar<0 || m_xoffChar>127) m_xoffChar=19;

   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnReplacedCharChanged() 
{
   if (m_replaceChar<0 || m_replaceChar>127) m_replaceChar=63;

   if (m_hCommFile != NULL) SetPortState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnInputBufferSizeChanged() 
{
   if (m_inputBufferSize<128)  m_inputBufferSize=128;
      
   if (m_xoffLimit>m_inputBufferSize) m_xoffLimit=(short)m_inputBufferSize;

   if (m_hCommFile != NULL)
      if (SetupComm(m_hCommFile, m_inputBufferSize, m_outputBufferSize))
     	   SetModifiedFlag();
}

void CApexCommCtrl::OnOutputBufferSizeChanged() 
{
   if (m_outputBufferSize<128)  m_outputBufferSize=128;
      
   if (m_xonLimit>m_outputBufferSize) m_xonLimit=(short)m_outputBufferSize;

   if (m_hCommFile != NULL)
      if (SetupComm(m_hCommFile, m_inputBufferSize, m_outputBufferSize))
     	   SetModifiedFlag();
}

void CApexCommCtrl::OnReadIntervalTimeoutChanged() 
{
   if (m_readIntervalTimeout<0) m_readIntervalTimeout=0; 

   if (m_hCommFile != NULL) SetCommTimeState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnReadTotalTimeoutMultiplierChanged() 
{
   if (m_readTotalTimeoutMultiplier<0) m_readTotalTimeoutMultiplier=0; 

   if (m_hCommFile != NULL) SetCommTimeState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnReadTotalTimeoutConstantChanged() 
{
   if (m_readTotalTimeoutConstant<0) m_readTotalTimeoutConstant=0; 

   if (m_hCommFile != NULL) SetCommTimeState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnWriteTotalTimeoutMultiplierChanged() 
{
   if (m_writeTotalTimeoutMultiplier<0) m_writeTotalTimeoutMultiplier=0; 

   if (m_hCommFile != NULL) SetCommTimeState();

	SetModifiedFlag();
}

void CApexCommCtrl::OnWriteTotalTimeoutConstantChanged() 
{
   if (m_writeTotalTimeoutConstant<0) m_writeTotalTimeoutConstant=0; 

   if (m_hCommFile != NULL) SetCommTimeState();

⌨️ 快捷键说明

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