MSComm控件实现串口通信的方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MSComm控件实现串口通信的方法
碧峰晨曦
摘要:详细介绍了MSComm控件,并在VC++6.0中利用MSComm控件开发了基于对话框的串口通信实例。
关键词:串口通信,MSComm,VC++
图书编号:TP311
0.引言
串口通信具有实现简单、价格低廉、通信稳定、数据传输可靠等优点,因而广泛应用于各种工业控制系统中。MSComm控件是微软公司开发的专门用于串口通信的控件。该控件为开发串口通信程序提供了更加快捷、容易的方法。在VC++中,对控件属性的操作都是通过特定的函数来实现的,这些函数都是CMSComm类的成员函数。当声明了一个CMSComm类对象后,就可以通过如下格式调用成员函数来访问控件属性了:
<对象名>.<成员函数名>(<参数表>)或<对象名>-><成员函数名>(<参数表>)
1.MSComm控件属性及事件
1.1 MSComm控件属性
MSComm控件有许多属性,最主要的几个属性如下:
1)CommPort:设置该属性值可以获取当前程序使用的串口编号。
2)Setting:设置或者获取串行通信的通信参数(包括波特率、奇偶校验类型、数据位数及停止位数等)。
3)PortOpen:设置该属性可以打开或关闭串口。
4)Input:从接收缓冲区中返回并删除数据。
5)Output:向串口通信输出缓冲区写入数据。
6)CommEvent:当MSComm控件在运行时发生错误或产生各种事件时,向程序返回错误或事件类型。
1.2 MSComm控件的事件
该控件只有一个事件,即OnComm事件。当CommEvent属性值发生变化时就会触发OnComm事件。根据CommEvent属性值来分别执行各种情况下的处理程序。
2 MSComm控件实例应用
2.1插入MSComm控件
在VC++6.0中新建一个基于对话框的工程,命名为Test。默认情况下,VC++6.0中不会包含MSComm控件,所以需要我们手动将MSComm控件加载到VC++6.0中。
(1)单击主菜单project的子菜单Add To project的Components and Controls选项;
(2)在弹出的“Components and Controls Gallery”对话框中选择Registered ActiveX Controls文件夹中的“Microsoft Communications Control,version6.0”选项,如图l:
图1.插入MSComm控件
单击其中的“Insert’’按钮,MSComm控件就被增加到工程中了。与此同时,类CMSComm的相关文件mscomm.h和mscomm.cpp也一并被加人Project的Header Files和Source Files中。
为了使用MSComm控件,将MSComm控件拖入对话框。在使用控件编程前还需创建该控件的实例,使用使用ClassWizard添加对话框类CTestDlg的WM_CREATE消息响应函数OnCreate(LPCREATESTRUCT lpCreateStruct) ,在该函数内创建控件实例:
int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
……
// TODO: Add your specialized creation code here
DWORD style=WS_VISIBLE|WS_CHILD;
if (!myComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
return -1;
}
return 0;
}
2.2串口初始化及打开
初始化主要完成串口的通信参数设置,设置好参数后就可以打开串口了。
在对话框的头文件Test.h中最顶行,加入引用控件类的代码:
#include "mscomm.h"
然后,在对话框类的定义代码中加入CMSComm类变量的声明:
CMSComm mycomm;
在CTestDlg::OnInitDialog()函数中添加串口初始化代码:
BOOL CTestDlg::OnInitDialog()
{
……
myComm.SetCommPort(2); //选择COM2
myComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
myComm.SetInBufferSize(2048); //指定接收缓冲区大小
myComm.SetInBufferCount(0); //清空接收缓冲区
myComm.SetInputMode(1); //设置数据获取方式
myComm.SetInputLen(0); //设置每次读取长度
myComm.SetRThreshold(1); //设置接收OnComm事件门限值
myComm.SetOutBufferSize(1024); //设置发送缓冲区大小
myComm.SetOutBufferCount(0); //清空发送缓冲区
myComm.SetSThreshold(1); //设置发送OnComm事件门限
myComm.SetPortOpen(1); //打开串口
return TRUE; // return TRUE unless you set the focus to a control
}
2.3 OnComm事件处理
MSComm控件一般用OnComm事件来接收数据。使用ClassWizard加MSComm控件的OnComm消息响应函数OnOnCommMscomm(),该函数的作用为接收数据,其代码如下:
void CTestDlg::OnOnCommMscomm()
{
// TODO: Add your control notification handler code here
V ARIANT input1; //定义V ARIANT类型变量
BYTE rxdata[2048]; //定义存放二进制数据的数组
long len1,k;