程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> MSComm控件在基於單文檔中的應用

MSComm控件在基於單文檔中的應用

編輯:關於VC++

本文配套源碼下載

MSComm 作為一個串行通訊控件為程序員串口通訊編程節省了很多時間。在基於對話框的應用中加入一個MSComm控件非常簡單。只需進行以下操作即可:

打開“Project->Add To Project->Components and Controls->Registered Activex Controls”,然後選擇控件:Microsoft Communication Control,version 6.0插入到當前的工程中。這樣就將類 CMSComm 的相關文件 mscomm.cpp 和 mscomm.h 一並加入到了工程中。編程時只需將控件對話中的 MSComm 控件拖至你的應用對話框中就OK了。

對於單文檔的工程應用,如果Project中的視類是基於CFormView的,創建MSComm類的方法和基於對話框的操作沒什麼兩樣。而如果視類不是基於CFormView的,那麼創建MSComm類就和創建普通的ActiveX控件相類似。

1.在MscommDemoView.h中添加MSComm類聲明:

protected:
CMSComm m_Comm;

2.利用MFC ClassWizard添加CMscommDemoView::OnCreate函數並加入以下代碼:DWORD style=WS_VISIBLE|WS_CHILD;
if(!m_Comm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM));
{
  TRACE0("Failed to create OLE Communication Controls!\n");
  return -1;
}

ID_MSCOMM 是源於對話框的中的控件ID規則,而且必須和 MSComm 控件對應,這裡利用 About 對話框。把控件對話框中 MSComm 控件拖至 About 對話框。ID值為ID_MSCOMM。

3.串口初始化:m_Comm.SetCommPort(1);
m_Comm.SetInputMode(1);
m_Comm.SetSettings("9600,n,8,1");
m_Comm.SetRThreshold(1);
m_Comm.SetInputLen(0);
if(!m_Comm.GetPortOpen())
{
  m_Comm.SetPortOpen(TRUE);
}
else
  AfxMessageBox(“Open The Serial Port 1 Failurre!”);
m_Comm.GetInput();

4.串口接收數據初始化:

MSComm 控件采用查詢或事件驅動的方式從端口獲取數據。這裡采用事件驅動法完成對端口數據的監視和處理:有事件發生(串口接收到數據)時通知程序,並及時的捕獲和處理這個通訊事件。

在MscommDemoView.h中添加事件驅動說明:protected:
  afx_msg void OnComm();
DECLARE_EVENTSINK_MAP()

在 MscommDemoView.cpp 中添加事件的驅動:BEGIN_EVENTSINK_MAP(CMscommDemoView, CView)
  //{{AFX_EVENTSINK_MAP(CAboutDlg)
ON_EVENT(CMscommDemoView,IDC_MSCOMM,1,OnComm,VTS_NONE)
  //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

5.串口數據讀寫:

MSComm 類的讀寫函數比較簡單:GetInput()和SetOutput()。函數原形分別為VARIANT GetInput()和void SetOutput(const VARIANT newValue),均使用VARIANT類型。但PC機發送和接收數據時習慣用字符串形式。MSDN中查閱VARIANT類型,可以用BSTR表示字符串,但所有的BSTR都包含寬字符,而只有Windows NT支持寬字符,Windows 9X並不支持。所以要完成一個適應各平台的串口應用程序必須解決這個問題。這裡使用CbyteArray即可解決之。

添加事件響應函數CMscommDemoView::OnComm()

//接收數據 void CMscommDemoView::OnComm()
{
  VARIANT m_input;
  char *str,*str1;
  int k,nEvent,i;
  CString str2,m_RcvData;
  nEvent=m_Comm.GetCommEvent();
  switch(nEvent)
  {
  case 2:
    k=m_Comm.GetInBufferCount(); //接收緩沖區的字符數目
    if(k>0)
    {
      m_input=m_Comm.GetInput();
      str=(char*)(unsigned char*)m_input.parray->pvData;
    }
    i=0;
    str1=str;
    while(i<k)
    {
      i++;
      str1++;
    }
    *str1=''''\0'''';
    str2=(const char*)str; //清除字符串中的不必要字符
    m_RcvData=(const char *)str;
  }
  //數據顯示處理
}
//發送數據
void CMscommDemoView::SendData()
{
  int i,Count;
  CString m_SendData;
  m_SendData="Hello!";
  Count=m_SendData.GetLength();
  CByteArray m_Array;

  m_Array.RemoveAll();
  m_Array.SetSize(Count);

  for(i=0;i<Count;i++)
    m_Array.SetAt(i,m_SendData[i]);
  m_Comm.SetOutput(COleVariant(m_Array));
}

以上只是MSComm控件在基於單文檔的工程中的初步框架。程序在Win2000+VC6.0下調試通過。歡迎大家討論。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved