在开发微机控制系统的过程中,我们经常需要通过rs-232串行接口与外部设备进行通信。例如分级控制系统中上位机与下位机的数据交换以及数据采集系统中计算机与数字仪表的通信等。在dos时代,编写串行通信程序是一件相当复杂的工作,程序员需要具备相当的硬件知识,对可编程串行通信接口芯片的内部寄存器定义、工作方式、指令字等相关内容有所了解,才有可能着手编写程序,大量的时间和精力都花在了如何与硬件打交道上,而不是花在我们的主要目的——获取与处理数据上;在windows下,win32api提供了使用createfile/writefile等文件i/o函数进行串行口操作的方法,但是在实现上仍然是相当烦琐的。幸运的是,windows平台先进的activex技术使我们在对串行口编程时不再需要处理烦琐的细节。利用已有的activex控件,我们只需要编写少量的代码,就可以轻松高效地完成任务。本文以windows 98下用visual c++6.0开发pt650c秤重显示器的通信模块为例,探讨了使用microsoft communications control控件进行串行通信的方法。
1、activex控件介绍
activex是windows下进行应用程序开发的崭新技术,它的核心内容是组件对象模型com(component object model)。activex控件包括一系列的属性、方法和事件,使用activex控件的应用程序和activex控件之间的工作方式是客户/服务器方式,即应用程序通过activex控件提供的接口来访问activex控件的功能。
microsoft communications control(以下简称mscomm)是microsoft公司提供的简化windows下串行通信编程的activex控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(event-driven)方法,一是查询法。
1.1 事件驱动法
在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,mscomm控件将解发oncomm事件,而应用程序在捕获该事件后,通过检查mscomm控件的commevent属性可以获知所发生的事件或错误,从而采取相应的操作。这种方法的优点是程序响应及时,可靠性高。
1.2 查询法
这种方法适合于较小的应用程序。在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查mscomm控件的commevent属性以检查执行结果或者检查某一事件是否发生。例如,当程序向串行设备发送了某个命令后,可能只是在等待收到一个特定的响应字符串,而不是对收到的每一个字符都立刻响应并处理。
mscomm控件有许多重要的属性,其中首要的几个如表1所示。
2、编程实现
在使用mscomm控件开发pt650c秤重显示器通信程序时,采用了事件驱动法,主要是在comevreceive(接收到数据)事件发生时响应并获取缓冲区中的数据。以下具体介绍实现方法。
打开visual c++6.0集成开发环境,创建一个基于对话框的mfc应用程序项目,命名为mycom,记住在设置项目选项时必须选上activex controls,其他的按照缺省设置。完成这一步后,选择菜单项project/add to project/components and controls……,将弹出一个对话框以选择系统中已有的组件(components)和控件(controls)。选择registered activex controls文件夹下的microsoft communications control项并按下insert按钮,将mscomm控件支持加入到本项目中。这时将生成一个名为cmscomm的c++类,并且在对话框编辑器里的工具栏将出现mscomm控件图标。cmscomm类是由mscomm控件导出的一系列接口函数构成的,利用它将可以访问mscomm控件的属性(property)和方法(method)。
假设pt650c秤重显示器接在计算机com1口上,那么打开资源编辑器,在程序主对话框(资源id为idd_mycom_dialog)上面放置一个mscomm控件,并用class wizard为该对话框类添加对应该控件的成员变量m_wnd com1。由于pt650c秤重显示器与计算机进行串行通信时采用7个数据位、1个停止位、偶校验方式,并且波特率为2400/4800/9600可选,这里我采用9600波特率,在对话框编辑器中设置mscomm控件的属性如下:
id:idc_com1(资源id)
commport:1 (com1)
settings:9600,e,7,1(波特率9600,偶校验,7个数据位,1个停止位)
rthreshold:(每接收到1个字符就触发一个接收数据事件)
sthreshold:0(不触发发送缓冲区空事件)
inputlen:1(每次读操作从缓冲区中取一个字符)
其他选项按照缺省设置或者根据具体设备的要求进行设置。如果需要通过多个串行口与多台设备通信,那么每一个串行口对应于一个单独的mscomm控件。串行口的设置参数既可以在对话框编辑器里设定,也可以在程序代码中通过调用cmscomm类的成员函数设定。例如,我们可以在mycomdlg类的oninitdialog成员函数中初始化mscomm控件的参数,代码如下:
bool cmycomdlg::oninitdialog()
{
cdialog:oninitdialog();
//以上为mfc框架自动生成的代码,在此不列出
//todo:add extra initialization here
m_wndcom1.setcommport(1);
m_wndcom1.setsettings(“9600,e,7,1”);
m_wndcom1.setrthreshold(1);
m_wndcom1.setsthreshold(0);
m_wndcom1.setinputlen(1);
m_wndcom1.setportopen(true);//打开通信口
return true;//return true unless you set the focus to a control
}
接下来为程序主对话框建立响应mscomm事件的处理函数,每当mscomm控件触发事件时该函数将被调用。在对话框编辑器中用鼠标左键双击mscomm控件图标,在弹出的对话框中输入函数名oncommcom1,该事件处理函数的原型定义和消息映射入口将自动被添加到cmycomdlg类中,我们所要做的只是在oncommcom1函数中给出具体的数据处理程序段,代码示例如下:
void cmycomdlg::oncommcom1()
{
//tod o:add your control notification handler code here
cstring sinput;
switch(m_wndcom1.getcommevent())
{
case 1: //comevsend事件
/*如有数据要发送,可采用以下代码:
variant varout;
variantinit(&varout);
varout.vt=vt_bstr;
uses_conversion;
varout.bstrval=sysallocstring(t2ole)(“my data”));
if(varout.bstrval){
m_wndcom1.setoutput(varout);
sysfreestring(varout.bstrval);
}
*/
break;
case 2: //comevreceiv事件,有数据到达
sinput=m_wndcom1.getinput().bstrval;
//对接收到的数据做必要处理
break;
case 1009://comeventrxparity事件,奇偶校验错误
//错误处理代码
break;
default:
break;
}
在这里必须注意的一点是在发送字符数据时,必须向mscomm控件提供unicode格式的字符串,在以上代码中用到了uses_conversion和t2ole宏进行ansi字符串到unicode字符串的转换,具体内容可参考visual c++6.0所带的msdn文档,在此不加赘述。
本文对windows 98下visual c++ 程序中使用mscomm串行通信activex控件编程的方法做了探讨,显示了activex技术的强大功能、充分的灵活性和易用性,具有一定的实践意义。
IceLake处理器测试 可在一些主流的电竞游戏中达到较为流畅运行帧率
UL83热塑型材料绝缘线
小米6配置逆天即将发布,小米5售价将大幅下调
供应R&S罗德与施瓦茨ESPI测试接收机
智诺科技平安城市解决方案的应用性能特点分析
基于ActiveX控件实现PT650C秤重显示器的通信模块设计
众多自动驾驶领域的新成果集中在世界人工智能大会的“舞台”上“绽放”
南方电网洪丹轲:响应国家新基建的战略部署,推动5G+智能电网的产业发展
关于22种PCB设计错误总结
新造车企业融资大战又要上演,百度再加码,威马累计融资230亿
TVS管的功率如何计算_TVS管的使用范围
想加入机器人行业 就要做一些实事
浪潮信息正式加入Arm SystemReady™ 计划
AMD锐龙Threadripper1950X评测 7900X的性能在1950X与1920X之间
智能电表市场正处于新一轮集中替换周期,新型存储设备将大有可为!
iQOONeo有哪些卖点
中国移动正式发布“大云操作系统”
!销售/回收HP33120A函数发生器HP33120A 小兵
央行为何会对数字货币进行研究和发行?增强货币市场控制力
数码录音笔主要功能有哪些?