原创 深入浅出VC++串口编程之基于控件

2008-10-26 18:58 2620 8 8 分类: 软件与OS
为了处理接收事件,我们需要为MScomm控件添加对应的消息处理函数。如下图,我们通过"MFC类向导"添加了CSerialPortActivexDlg 类的成员函数OnCommMscomm1():

  这样,在对话框的头文件中就会自动增加下面两句:


afx_msg void OnCommMscomm1();//函数声明
DECLARE_EVENTSINK_MAP()

  来自AFX_MSG部分:


// Generated message map functions
//{{AFX_MSG(CSerialPortActivexDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnClearButton();
 afx_msg void OnSendButton();
 afx_msg void OnCommMscomm1();
 DECLARE_EVENTSINK_MAP()
//}}AFX_MSG

  同时在对话框的.cpp文件中会增加下列代码实现串口消息映射:


BEGIN_EVENTSINK_MAP(CSerialPortActivexDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CSerialPortActivexDlg)
 ON_EVENT(CSerialPortActivexDlg, IDC_MSCOMM1, 1 /* OnComm */,
 OnCommMscomm1, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

  我们定义CSerialPortActivexDlg::OnCommMscomm1()函数主要处理数据的接收,其源代码为:


void CSerialPortActivexDlg::OnCommMscomm1()
{
 // TODO: Add your control notification handler code here
 UpdateData(true);

 VARIANT variant_inp;
 COleSafeArray safearray_inp;

 long i = 0;
 int len;
 char rxdata[1000];
 CString tmp;
 switch (m_mscom.GetCommEvent())
 {
  case 2:
  //表示接收缓冲区内有字符
  {
   variant_inp = m_mscom.GetInput();
   safearray_inp = variant_inp;
   len = safearray_inp.GetOneDimSize();
   for (i = 0; i < len; i++)
   {
    safearray_inp.GetElement(&i, &rxdata);
   }
   rxdata = '\0';
  }
  m_recv += rxdata;
  UpdateData(false);
  break;
  default:
   break;
}
}

  最后,与连载三类似,再次借助"串口调试助手"以实例验证了本程序的正确性,如下图:



深入浅出VC

  最后,需要特别提示的是:如果要在基于"文档/视图"的框架结构程序而非对话框程序中使用串口控件,我们不能轻松地使用"MFC类向导",这时候必须手动地添加相关代码。

  在MainFrm.h头文件中加入:


afx_msg void OnCommMscomm();
DECLARE_EVENTSINK_MAP()

  并定义CMSComm成员变量:


CMSComm m_ComPort;

  在MainFrm.cpp文件中添加


BEGIN_EVENTSINK_MAP(CMainFrame, CFrameWnd)
ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)
//映射ACTIVEX控件的事件
END_EVENTSINK_MAP()

  在MainFrm.cpp文件的OnCreate(LPCREATESTRUCT lpCreateStruct)函数中添加:


ComPort.Create(NULL, WS_VISIBLE | WS_CHILD, CRect(0,0,0,0),this, ID_COMMCTRL);

  以创建CMSComm控件。

  此后,我们就可以在CMainFrame类的函数中使用串口控件对应的ComPort控件成员变量。

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条