本文配套源碼下載
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下調試通過。歡迎大家討論。