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