基于VC串口通信的实现
2007-07-05王立萍
王立萍
摘要:介绍在VC++6.0开发平台上。运用MSComm控件实现串口通信.通过实例进行具体详细说明。
关键词:串口通信MSComm
中图分类号TP368.1文献标识码B文章编号:1002-2422(2007)03-0046-02
1建立应用工程
打开Visual C++,建立一个基于对话框的MFC应用程序,在对话框中添加控件,用ClassWizard为相应控件设置属性及添加变量如表l所示,其中MSComm的添加见第二步。
2在当前工程中添加MSComm控件
单击菜单Add To Project->Components and Controls,在打开的对话框中选择“Begistered AetiveX Controls”,再双击此项出现控件选择对话框“Component and Controls Gallerf”,在该框中选择“Microsoft Communications Control,version 6.O”控件,再单击“Insert”按钮,提示“Insert this com-ponent?”,确认后,可以看到加入CMSComm类的Confirm Class对话框,提示加入到当前工程中的CMSComm类头文件为MSComm.h,实现文件为MSComm.epp。单击“OK”按钮关闭Confirm Class对话框,再单击“Close”关闭Component and Controls Gallery对话框,则在VC集成环境中,当前工程的Class View中就出现了CMSComm类,同时在对话框资源控件中出现了一个电话机形状的控件,就是MSComm控件。
利用这种添加控件的方法,对之后的串口消息事件处理会提供很大的方便,ClassWizard会自动在当前程序工程中进行消息类的映射。
3初始化串口
通过以上操作,ClassWizard自动在SCommTestDlg.h中加入了#include“mscomm.h”语句。
//{AFX_INCLUDES()
#include“mscomm.h”
//}lAFX_INCLUDES
下面,在CSCommTestDlg::OnlnitDialog()函数中写入对串口的初始化语句,串口初始化语句由IDC_MSCOMMI的CMSComm控制变量m_etrlComm来设置串口控件属性。代码如下:
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从串口接收数据
MSComm控件一般用事件驱动方式从串口接收数据,也就是消息处理,当串口有事件发生时,程序调用消息函数来处理数据。打开ClassWizard→Message Maps,在ClassName中选择类CcomDlg,再在Object IDs中选择IDC_MSCOMMl,然后在Message中双击消息OnComm(或单击“Add Function”),在弹出的对话框中将函数名改为OnComm,单击“OK”。就加入了串口事件的消息处理函数。在coreDlg.cpp文件中编写OnComm()中的代码,主要任务是从串口接收数据并显示在接收编辑框中。
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
发送数据
先为发送按钮添加一个单击消息,即BN_CLICKED处理函数,打开ClassWizard→Message Maps,选择类CComDlg,选中IDC_BUTrON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend函数,在函数中添加如下代码:
void CComDlg::OnButtonManualsend()
{ updateData(TRUE);
m_ctrlComm.SetOutput(COleVariant(m_strEditTXData));
}
6程序测试及结果
需要两个串口来测试程序,这两个串口可以在一台计算机上,也可以分别在两台计算机上,可自制一个三线串口线(发送、接收、地)将其连接。可通过串口调试助手。
7结束语
通过实例介绍了基于VC控件MSComm的串口通信方法,MSComm控件比较简单,一般只是用于较简单的系统,串口通信还可以使用Windows API函数和CSerial类,可以根据实际情况选择合适的方法。