Com"/>
王立萍
摘要:介紹在VC++6.0開發(fā)平臺上。運(yùn)用MSComm控件實(shí)現(xiàn)串口通信.通過實(shí)例進(jìn)行具體詳細(xì)說明。
關(guān)鍵詞:串口通信MSComm
中圖分類號TP368.1文獻(xiàn)標(biāo)識碼B文章編號:1002-2422(2007)03-0046-02
1建立應(yīng)用工程
打開Visual C++,建立一個基于對話框的MFC應(yīng)用程序,在對話框中添加控件,用ClassWizard為相應(yīng)控件設(shè)置屬性及添加變量如表l所示,其中MSComm的添加見第二步。
2在當(dāng)前工程中添加MSComm控件
單擊菜單Add To Project->Components and Controls,在打開的對話框中選擇“Begistered AetiveX Controls”,再雙擊此項(xiàng)出現(xiàn)控件選擇對話框“Component and Controls Gallerf”,在該框中選擇“Microsoft Communications Control,version 6.O”控件,再單擊“Insert”按鈕,提示“Insert this com-ponent?”,確認(rèn)后,可以看到加入CMSComm類的Confirm Class對話框,提示加入到當(dāng)前工程中的CMSComm類頭文件為MSComm.h,實(shí)現(xiàn)文件為MSComm.epp。單擊“OK”按鈕關(guān)閉Confirm Class對話框,再單擊“Close”關(guān)閉Component and Controls Gallery對話框,則在VC集成環(huán)境中,當(dāng)前工程的Class View中就出現(xiàn)了CMSComm類,同時(shí)在對話框資源控件中出現(xiàn)了一個電話機(jī)形狀的控件,就是MSComm控件。
利用這種添加控件的方法,對之后的串口消息事件處理會提供很大的方便,ClassWizard會自動在當(dāng)前程序工程中進(jìn)行消息類的映射。
3初始化串口
通過以上操作,ClassWizard自動在SCommTestDlg.h中加入了#include“mscomm.h”語句。
//{AFX_INCLUDES()
#include“mscomm.h”
//}lAFX_INCLUDES
下面,在CSCommTestDlg::OnlnitDialog()函數(shù)中寫入對串口的初始化語句,串口初始化語句由IDC_MSCOMMI的CMSComm控制變量m_etrlComm來設(shè)置串口控件屬性。代碼如下:
m_ctdlComm.SetCommPort(1)
m_ctdlComm.SetInputMode(1)
m_ctdlComm.SetlnBufferSize(1024)
m_ctdlComm.SetOutBufferSize(512)
m_ctrlComm.SetSettings(“9000,n,8,1”)
if(lm_ctrlComm.GetPortOpen())
m_culComm.SetPortOpen(TRUE)
m_ctdlComm.SetRThreshold(1)
m_ctrlComm.SetInputLen(0)
m_ctrlComm.Getlnput()
4從串口接收數(shù)據(jù)
MSComm控件一般用事件驅(qū)動方式從串口接收數(shù)據(jù),也就是消息處理,當(dāng)串口有事件發(fā)生時(shí),程序調(diào)用消息函數(shù)來處理數(shù)據(jù)。打開ClassWizard→Message Maps,在ClassName中選擇類CcomDlg,再在Object IDs中選擇IDC_MSCOMMl,然后在Message中雙擊消息OnComm(或單擊“Add Function”),在彈出的對話框中將函數(shù)名改為OnComm,單擊“OK”。就加入了串口事件的消息處理函數(shù)。在coreDlg.cpp文件中編寫OnComm()中的代碼,主要任務(wù)是從串口接收數(shù)據(jù)并顯示在接收編輯框中。
void CComDlg:OnComm()
{VARIANT varlant_inp;
ColeSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]:
CStrlng strtemp;
if(m_ctrlComm.GetCommEvent()==2)
{
varlant_inp=m ctrlComm.GetInput():
safearray_in=variant_inp;
len=safeary_inp.GetOneDimSize():
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k):
for(k=O;k<len;k++)
{
BYTE bl=*(char*)(rxdata+k):
strtemp.Format(“%c”,bt);
m_strEditR.XData+=strtemp;
}
}
UpdateData(FALSE);
}
5
發(fā)送數(shù)據(jù)
先為發(fā)送按鈕添加一個單擊消息,即BN_CLICKED處理函數(shù),打開ClassWizard→Message Maps,選擇類CComDlg,選中IDC_BUTrON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend函數(shù),在函數(shù)中添加如下代碼:
void CComDlg::OnButtonManualsend()
{ updateData(TRUE);
m_ctrlComm.SetOutput(COleVariant(m_strEditTXData));
}
6程序測試及結(jié)果
需要兩個串口來測試程序,這兩個串口可以在一臺計(jì)算機(jī)上,也可以分別在兩臺計(jì)算機(jī)上,可自制一個三線串口線(發(fā)送、接收、地)將其連接??赏ㄟ^串口調(diào)試助手。
7結(jié)束語
通過實(shí)例介紹了基于VC控件MSComm的串口通信方法,MSComm控件比較簡單,一般只是用于較簡單的系統(tǒng),串口通信還可以使用Windows API函數(shù)和CSerial類,可以根據(jù)實(shí)際情況選擇合適的方法。