直接分析mscomm.h头文件就可以完备地获取这个控件的使用方法(主要是public类型的接口函数),下面我们摘取了头文件的主要代码并对其关键部分给出了注释:
#if !defined(AFX_MSCOMM_H__) #define AFX_MSCOMM_H__ #if _MSC_VER > 1000 #pragma once
#endif // _MSC_VER > 1000
// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++
// NOTE: Do not modify the contents of this file. If this class is regenerated by // Microsoft Visual C++, your modifications will be overwritten.
///////////////////////////////////////////////////////////////////////////// // CMSComm wrapper class
class CMSComm : public CWnd {
protected:
DECLARE_DYNCREATE(CMSComm) public:
CLSID const& GetClsid() {
static CLSID const clsid = { 0x648a5600, 0x2c6e, 0x101b, { 0x82, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14 } }; return clsid; }
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect,
CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }
BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE, BSTR bstrLicKey = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID, pPersist, bStorage, bstrLicKey); }
// Attributes public:
// Operations public:
void SetCDHolding(BOOL bNewValue); BOOL GetCDHolding();
void SetCommID(long nNewValue); long GetCommID();
void SetCommPort(short nNewValue); //设置端口号,如nNewValue =1表示COM1 short GetCommPort();
void SetCTSHolding(BOOL bNewValue); BOOL GetCTSHolding();
void SetDSRHolding(BOOL bNewValue); BOOL GetDSRHolding();
void SetDTREnable(BOOL bNewValue); BOOL GetDTREnable();
void SetHandshaking(long nNewValue); long GetHandshaking();
void SetInBufferSize(short nNewValue); short GetInBufferSize();
void SetInBufferCount(short nNewValue); short GetInBufferCount();
void SetBreak(BOOL bNewValue); BOOL GetBreak();
void SetInputLen(short nNewValue); short GetInputLen();
void SetNullDiscard(BOOL bNewValue); BOOL GetNullDiscard();
void SetOutBufferSize(short nNewValue); short GetOutBufferSize();
void SetOutBufferCount(short nNewValue); short GetOutBufferCount();
void SetParityReplace(LPCTSTR lpszNewValue); CString GetParityReplace();
void SetPortOpen(BOOL bNewValue);
//打开或关闭串口,TRUE:打开,FALSE:关闭 BOOL GetPortOpen();
//串口是否已打开,TRUE:打开,FALSE:关闭 void SetRThreshold(short nNewValue);
//如果设置为1,表示一接收到字符就发送2号事件 short GetRThreshold();
void SetRTSEnable(BOOL bNewValue); //硬件握手使能? BOOL GetRTSEnable();
void SetSettings(LPCTSTR lpszNewValue);
//Settings由4部分组成,其格式为:\,D,S\,即\波特率,是否奇偶校验,数据位 //个数,停止位\,如设置为:\ CString GetSettings();
void SetSThreshold(short nNewValue);
//如果保持缺省值0不变,则表示发送数据的过程中串口上不发生事件 short GetSThreshold();
void SetOutput(const VARIANT& newValue);
//一个非常重要的函数,用于写串口,注意其接收的输入参数为VARIANT类型对象, //我们需要将字符串转化为VARIANT类型对象 VARIANT GetOutput();
void SetInput(const VARIANT& newValue); VARIANT GetInput();
//一个非常重要的函数,用于读串口,注意其返回的是VARIANT类型对象,我们需要 //将其转化为字符串
void SetCommEvent(short nNewValue); short GetCommEvent();
//一个非常重要的函数,获得串口上刚发生的事件(\事件\可以理解为软件意义上的 //\消息\或硬件意义上的\中断\),事件的发送会导致OnComm消息的诞生! void SetEOFEnable(BOOL bNewValue); BOOL GetEOFEnable();
void SetInputMode(long nNewValue); long GetInputMode(); };
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif
分析上述源代码可知,基本上,MSComm的诸多接口可以分为如下几类:
(1)打开与设置串口接口函数;
(2)获得串口设置和串口状态接口函数;
(3)设置串口发送数据方式、缓冲区接口及发送数据接口函数;
(4)设置串口接收数据方式、缓冲区接口及接收数据接口函数;
(5)设置与获取串口上发生的事件接口函数。
2.例程
程序的功能和界面(如下图)都与本文连载三中《基于WIN32 API的串口编程》相同,不同的只是连
载三的串口通信以API实现,而本节的串口通信则以MSComm控件实现。
使用第1节的方法将控件添加入工程并添加mscomm.h和mscomm.cpp文件后,为了使用控件,我们
将控件拖入对话框内任意一个位置(运行时\电话\图标会隐藏),其操作如下图:
有趣而极富人性化的是我们可以直接右键单击这个\电话\,来设置串口的属性,如下图:
接着,我们需要为控件添加一个对应的成员变量m_mscom,其对应的变量类型为CMSComm,如下图:
这样就建立了m_mscom和IDC_MSCOMM1控件的相互映射: