广轻控股集团有限公司:VC++中用通讯控件开发串行通信程序
来源:百度文库 编辑:偶看新闻 时间:2024/05/02 00:25:08
本文详细介绍了Visual C++5.0版中有关通讯控件的使用方法,并给出了一个利用该控件编写的简单通用的通信示例程序。
关键词:串行通信 通讯控件
下面,我们将结合一个具体的例子来说明。本程序的编程环境是Win95和Visual C++5.0。这个编程示例的功能比较强,它可以由用户选定进行传输的通信端口,并设定这个端口的相关参数,包括波特率、数据位、停止位、奇偶校验和流量控制等。还具有发送数据和接收数据的双重功能。
一. 在程序中嵌入通讯控件
启动Visual C++5.0,利用MFC AppWizard(exe)新建一个项目文件,并命名为CommTest,在AppWizard第一步选择基于对话框的应用程序类型(Dialog based),在第二步将ActiveX Controls复选框选中,表示本程序支持ActiveX控件。其他均接收缺省设置,AppWizard将自动生成一个以对话框为主窗口的应用程序。下面我们将在该程序中加入通讯控件。在Resource View中打开对话框(IDD_COMMTEST_DIALOG),将其修改为如图一所示的对话框。注意将对话框的语言属性改为Chinese(P.R.C)。
单击Project菜单,从菜单中选择Add to Project,再单击Components and Controls,从弹出的对话框中单击Registered ActiveX Controls,然后在列表框中选择Microsoft Communications Control,version 5.0,单击OK。这时会询问你是否加入CMSComm类,单击OK,返回后就会看到控件工具条上添加了一个通讯控件(形状如电话机),将其拖放到对话框上,同时注意到Project中新增加了一个类。通过查看类MSComm的源文件mscomm.cpp,我们可以了解这个控件的属性和使用方法,其中的Get…函数可以用来访问该属性的当前值,而Set…函数则用来设置该属性的新值。
二. 设置通讯控件的属性值
激活通讯控件的属性对话框,一些重要的属性及其说明如表一所示:
属 性
设定值
说 明
CommPort
2
串口号,一般串口为鼠标所用,故用串口2
InBufferSize
1024
接收缓冲区大小
InputLen
0
从接收缓冲区读取的字节数,0表示全部读取
InputMode
1
接收数据的类型,0表示文本类型,1表示二进制类型
OutBufferSize
1024
发送缓冲区大小
RThreshold
1
设定当接收几个字符时触发OnComm事件,0表示不产生事件,1表示每接收一个字符就产生一个事件
SThreshold
0
设定在触发OnComm事件前,发送缓冲区内所允许的最少的字符数,0表示发送数据时不产生事件,1表示当发送缓冲区空时产生OnComm事件
Settings
9600,n,8,1
串口的参数设置,依次为波特率、奇偶校验(n-无校验,e-偶校验,o-奇校验)、数据位数、停止位数
表1 串口属性及说明
上面表中的属性设定值是本例程中所用的值,可根据需要灵活设定。至于其它的属性可采用缺省值,其说明可参考联机帮助文件。
通讯控件的工作原理类似与中断方式,当有通讯事件发生时(如发送数据、接收数据等),就会触发OnComm事件,在该事件的处理函数中调用GetCommEvent()函数,通过返回值即可确定是那类事件,再做出相应的处理。
三. 主程序的编制
首先我们为对话框中的控件添加对应的变量和响应函数。具体做法如表二所示:
控件名称
控件ID
对应变量或函数
发送数据编辑框
IDC_SENDDATA
m_SendData
接收数据编辑框
IDC_RECEIVEDATA
m_ ReceiveData
发送按钮
IDC_SEND
OnSend()
清除按钮
IDC_CLEAR
OnClear()
通讯控件
IDC_MSCOMM
m_Comm
表2 添加控件表
再打开ClassWizard,选中IDC_MSCOMM,可看到该控件能响应的消息为OnComm,添加改函数并将其改名为OnComm(),在该函数中添加代码,就能实现对串口事件的处理。
其中一个需要注意的问题是函数GetInput()返回的是VARIANT型变量,而在编辑框中显示的是CString型变量,因此必需进行转换。先将VARIANT型变量转换为COleSafeArray型变量,再将其转换为BYTE型数组,然后将数组转换为CString型变量。这个转换过程看起来比较复杂,但它可以满足用不同的变量类型来显示接收数据。该程序的主要代码添加在CommTestDlg.cpp中,如下所示:void CCommTestDlg::OnSend()
{
if(!m_Comm.GetPortOpen())
m_Comm.SetPortOpen(TRUE);//打开串口
UpdateData(TRUE);
m_Comm.SetOutput(COleVariant(m_SendData));//发送数据
}
void CCommTestDlg::OnClear()
{
m_ReceiveData.Empty();//清除接收对话框中的数据
m_SendData.Empty();//清除发送对话框中的数据
UpdateData(FALSE);
}
void CCommTestDlg::OnComm()
{
VARIANT m_Input1;
COleSafeArray m_Input2;
long length,i;
BYTE data[1024];
CString str;
if(m_Comm.GetCommEvent()==2)//接收缓冲区内有字符
{
m_Input1=m_Comm.GetInput();//读取缓冲区内的数据
m_Input2=m_Input1;//将VARIANT型变量转换为COleSafeArray型变量
length=m_Input2.GetOneDimSize();//确定数据长度
for(i=0;i
m_Input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
for(i=0;i
{
char a=*(char*)(data+i);
str.Format("%c",a);
m_ReceiveData+=str;
}
}
UpdateData(FALSE);//更新编辑框内容
}
四. 试验程序
现在程序已经写完,可以编译运行。我们可以做一个小实验来验证程序的功能。首先检验你的串口2,看它是否工作正常,可用常见的DOS程序Comdebug检查。确认串口工作正常后,可用串口线将两台微机的串口2相连,同时在两台机子上运行该程序(也可只用一台微机,将其串口2的2脚和3脚短接,即自发自收状态),在发送对话框中随便敲入一些字符,用鼠标点发送按钮,你就会在另一台机子的接收对话框中看到这些数据,甚至汉字也可以发送。由此可见,利用通讯控件可以很容易的编写出串行通信程序。但相对来说通讯控件在VC中的使用要比在VB中复杂的多,要想开发出更多更灵活的使用方法还需要不断的摸索和实践。
串行通讯的双方都必须遵守( )的通讯数据格式,编写各自的通讯程序。
找VC高手开发程序
串行通讯方式有哪几种?
我编的程序中用了一个FlexGrid网格控件,在其他没有装VC的机子上无法使用,怎样才能解决这个问题?
串行通信的基本原理?
vc能开发web程序吗?
用VC开发mysql数据库程序问题
VB 串行通讯的问题
vc++中用API编写的串口通信,怎样动态更改串口号?
如何在 VC++6.0 中使用 MSComm 控件与单片机通讯?
有关串行通信的汇编程序
8031双机串行通信实验设计
用VC++怎么进行多媒体光盘程序的开发制作
求一个程序的源代码,使用VC开发的
VC中用ADO方法?
串行通讯为什么用字符串
串行通讯为什么用字符串?????
PLC串行通讯信号丢失解决方法
串行同步和串行异步通信各有什么特点?
VC++中用外来控件编程,把生成的exe放在另一个机子上却不能用,怎么解决?
在VC++6.0中用一个控件加一个按钮"绝对值",具体怎么加.把函数abs怎么加?
VC里面怎么把别的程序里list控件里数据读到自己的程序里
VC里面怎么把别的程序里list控件里数据读到自己的程序里
串行通信程序设计,帮个忙做做吧