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

📄 apexcommctl.h

📁 提供串口通讯参数设置接口
💻 H
字号:
///////////////////////////////////////////////////////////////
// 文件: ApexCommCtrl.h
// 功能: 控件类头文件,声明类的属性和方法,事件
// 作者: 王念峰
// 日期: 1999.04.19 - 创建
//       1999.05.15 - 修改,整理
// E_mai:wnf@wisepeak.com
// Http://www.wisepeak.com
///////////////////////////////////////////////////////////////
// 版本: 1.0
// 本程序建立一个用于串口通讯的控件ApexComm;
// 它使用线程类来实现实际的读串口和写串口;
// 用户可以通过调用方法WritePort 向串口写数据;
// 通过触发的OnReceiveData 事件来读取串口中的数据;
// 通过各属性来设置串口参数;(例如波特率,端口等)
// 通过OpenPort来启动串口通讯;
// 通过ClosePort来关闭串口通讯;
// 下面是程序中用到的用于线程读写的消息常量
///////////////////////////////////////////////////////////////
// 注:由于涉及串口通讯,要求系统必须同时响应串口事件和用户输入,
//    所以该处使用多线程来实现
///////////////////////////////////////////////////////////////

#if !defined(AFX_APEXCOMMCTL_H__F0A2BED5_F8B2_11D2_8A54_0080C8EB2FFE__INCLUDED_)
#define AFX_APEXCOMMCTL_H__F0A2BED5_F8B2_11D2_8A54_0080C8EB2FFE__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include "define.h"

class TReadThread;
class TWriteThread;

/////////////////////////////////////////////////////////////////////////////
class CApexCommCtrl : public COleControl
{
	DECLARE_DYNCREATE(CApexCommCtrl)

//构造函数
public:
	CApexCommCtrl();
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CApexCommCtrl)
	public:
	virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
	virtual void DoPropExchange(CPropExchange* pPX);
	virtual void OnResetState();
	protected:
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	//}}AFX_VIRTUAL

protected:
	~CApexCommCtrl();

	DECLARE_OLECREATE_EX(CApexCommCtrl)    // Class factory and guid
	DECLARE_OLETYPELIB(CApexCommCtrl)      // GetTypeInfo
	DECLARE_OLECTLTYPE(CApexCommCtrl)		// Type name and misc status

	//{{AFX_MSG(CApexCommCtrl)
	//}}AFX_MSG

   //自定义事件
   afx_msg LRESULT ReceiveData(WPARAM wParam, LPARAM lParam );
   afx_msg LRESULT CommHangup(WPARAM wParam, LPARAM lParam );
   afx_msg LRESULT ReceiveDataError(WPARAM wParam, LPARAM lParam );
   afx_msg LRESULT DataSendFinished(WPARAM wParam, LPARAM lParam );

   DECLARE_MESSAGE_MAP()

// 发布的属性和方法的映射
	//{{AFX_DISPATCH(CApexCommCtrl)
	CString m_portID;
	afx_msg void OnPortIDChanged();
	long m_baudRate;
	afx_msg void OnBaudRateChanged();
	BOOL m_enableParity;
	afx_msg void OnEnableParityChanged();
	BOOL m_outxCtsFlow;
	afx_msg void OnOutxCtsFlowChanged();
	BOOL m_outxDsrFlow;
	afx_msg void OnOutxDsrFlowChanged();
	short m_dtrControl;
	afx_msg void OnDtrControlChanged();
	BOOL m_dsrSensitivity;
	afx_msg void OnDsrSensitivityChanged();
	BOOL m_txContinueOnXoff;
	afx_msg void OnTxContinueOnXoffChanged();
	BOOL m_outxXonXoffFlow;
	afx_msg void OnOutxXonXoffFlowChanged();
	BOOL m_inxXonXoffFlow;
	afx_msg void OnInxXonXoffFlowChanged();
	BOOL m_replaceWhenParityError;
	afx_msg void OnReplaceWhenParityErrorChanged();
	BOOL m_ignoreNullChar;
	afx_msg void OnIgnoreNullCharChanged();
	short m_rtsControl;
	afx_msg void OnRtsControlChanged();
	short m_xonLimit;
	afx_msg void OnXonLimitChanged();
	short m_xoffLimit;
	afx_msg void OnXoffLimitChanged();
	short m_byteSize;
	afx_msg void OnByteSizeChanged();
	short m_parity;
	afx_msg void OnParityChanged();
	short m_stopBits;
	afx_msg void OnStopBitsChanged();
	short m_xonChar;
	afx_msg void OnXonCharChanged();
	short m_xoffChar;
	afx_msg void OnXoffCharChanged();
	short m_replaceChar;
	afx_msg void OnReplacedCharChanged();
	long m_inputBufferSize;
	afx_msg void OnInputBufferSizeChanged();
	long m_outputBufferSize;
	afx_msg void OnOutputBufferSizeChanged();
	long m_readIntervalTimeout;
	afx_msg void OnReadIntervalTimeoutChanged();
	long m_readTotalTimeoutMultiplier;
	afx_msg void OnReadTotalTimeoutMultiplierChanged();
	long m_readTotalTimeoutConstant;
	afx_msg void OnReadTotalTimeoutConstantChanged();
	long m_writeTotalTimeoutMultiplier;
	afx_msg void OnWriteTotalTimeoutMultiplierChanged();
	long m_writeTotalTimeoutConstant;
	afx_msg void OnWriteTotalTimeoutConstantChanged();
	afx_msg void OpenPort();
	afx_msg void ClosePort();
	afx_msg BOOL WritePort(LPCTSTR pDataToWrite, long dwSizeofDataToWrite);
	//}}AFX_DISPATCH
	DECLARE_DISPATCH_MAP()

//发布的事件的映射
	//{{AFX_EVENT(CApexCommCtrl)
	void FireOnReceiveData(LPCTSTR pDataReceived, long dwSizeOfDataReceived)
		{FireEvent(eventidOnReceiveData,EVENT_PARAM(VTS_BSTR  VTS_I4), pDataReceived, dwSizeOfDataReceived);}
	void FireOnCommHangup(BOOL bReadOrWrite)
		{FireEvent(eventidOnCommHangup,EVENT_PARAM(VTS_BOOL), bReadOrWrite);}
	void FireReceiveDataError(long dwEventMask)
		{FireEvent(eventidReceiveDataError,EVENT_PARAM(VTS_I4), dwEventMask);}
	void FireDataSendFinished()
		{FireEvent(eventidDataSendFinished,EVENT_PARAM(VTS_NONE));}
	//}}AFX_EVENT
	DECLARE_EVENT_MAP()

protected:
   TReadThread* ReadThread;
	TWriteThread* WriteThread;

public:
	HANDLE m_hCloseEvent;
	bool m_bSendDataEmpty;
	HANDLE m_hCommFile;
	enum {
	//{{AFX_DISP_ID(CApexCommCtrl)
	dispidPortID = 1L,
	dispidBaudRate = 2L,
	dispidEnableParity = 3L,
	dispidOutxCtsFlow = 4L,
	dispidOutxDsrFlow = 5L,
	dispidDtrControl = 6L,
	dispidDsrSensitivity = 7L,
	dispidTxContinueOnXoff = 8L,
	dispidOutxXonXoffFlow = 9L,
	dispidInxXonXoffFlow = 10L,
	dispidReplaceWhenParityError = 11L,
	dispidIgnoreNullChar = 12L,
	dispidRtsControl = 13L,
	dispidXonLimit = 14L,
	dispidXoffLimit = 15L,
	dispidByteSize = 16L,
	dispidParity = 17L,
	dispidStopBits = 18L,
	dispidXonChar = 19L,
	dispidXoffChar = 20L,
	dispidReplacedChar = 21L,
	dispidInputBufferSize = 22L,
	dispidOutputBufferSize = 23L,
	dispidReadIntervalTimeout = 24L,
	dispidReadTotalTimeoutMultiplier = 25L,
	dispidReadTotalTimeoutConstant = 26L,
	dispidWriteTotalTimeoutMultiplier = 27L,
	dispidWriteTotalTimeoutConstant = 28L,
	dispidOpenPort = 29L,
	dispidClosePort = 30L,
	dispidWritePort = 31L,
	eventidOnReceiveData = 1L,
	eventidOnCommHangup = 2L,
	eventidReceiveDataError = 3L,
	eventidDataSendFinished = 4L,
	//}}AFX_DISP_ID
	};
private:
	void CloseWriteThread();
	void CloseReadThread();
	void SetCommTimeState();
	void SetPortState();
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_APEXCOMMCTL_H__F0A2BED5_F8B2_11D2_8A54_0080C8EB2FFE__INCLUDED)

⌨️ 快捷键说明

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