当前位置:首页 > 工业控制 > 工业控制
[导读]摘要:详细论述在VC++6.0中使用ActiveX控件通过串口与单片机进行二进制数据传输的具体方法。 关键词:VC++ ActiveX 串行通信 在单片机应用系统中,经常需要通过RS-232串行口与微机进行通信。目前在各种操作系统中,

摘要:详细论述在VC++6.0中使用ActiveX控件通过串口与单片机进行二进制数据传输的具体方法。 关键词:VC++ ActiveX 串行通信 在单片机应用系统中,经常需要通过RS-232串行口与微机进行通信。目前在各种操作系统中,Microsoft的Windows较为常见,而且大多为 Windows95/98等32位平台。以往在Windows平台上的串行通信多使用其提供的API函数来实现,这种方法使用起来需要许多底层设置,因而较为繁琐,并且难以理解。Microsoft推出的ActiveX技术提供了另外一种实现串行通信的方法。这种方法不仅相对较为简单,而且非常实用。尤其是Visual C++这种可视化面向对象的编程环境中,可以真正把串口看作一个对象,编程时只需简单的设置,理解起来也很容易。下面详细讨论Microsoft提供的串行通信ActiveX控件的使用方法。该控件的相应文件是MSCOMM32.OCX,以下简称为MSCOMM控件。 一、MSCOMM控件 MSCOMM控件,即Microsoft Communication Control,是Microsoft为简化Windows下串行通信编程而提供的ActiveX控件。它提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他通信设备(如调制解调器),发出命令,交换数据以及监视和响应串行连接中发生的事件和错误。MSCOMM控件可用于创建电话拨号程序、串口通信程序和功能完备的终端程序。 MSCOMM控件提供了两种处理通信的方式: (1)事件驱动方式。当通信事件发生时,MSCOMM控件会触发OnComm事件,调用者可以捕获该事件,通过检查其CommEvent属性便可确认发生的是哪种事件或错误,从而进行相应的处理。这种方法的优点是响应及时、可靠性高。 (2)查询方式。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,这种方法可能更可取。例如,如果写一个简单的电话拨号程序,则没有必要每接收1个字符都产生事件,因为惟一等待接收的字符是调制解调器的"确定"响应。 在使用MSCOMM控件时,1个MSCOMM控件只能同时对应1个串口。如果应用程序需要访问和控件多个串口,那么必须使用多个MSCOMM控件。 在VC++中,MSCOMM控件只对应着1个C++类--CMSComm。由于MSCOMM控件本身没有提供方法,所以CMSComm类除了 Create()成员函数外,其他的函数都是Get/Set函数对,用来获取或设置控件的属性。MSCOMM控件也只有1个OnComm事件,用来向调用者通知有通信事件发生。 MSCOMM控件有许多很重要的属性,限于篇幅只给出几个较为重要和常用的属性,如表1所列。 表1 MSCOMM控件的重要属性 属 性说 明 CommPort 通信端口号 Settings 以字符串形式表示的波特率、奇偶校验、数据位 PortOpen 通信端口的状态,打开或是关闭 Input 接收数据 Output 发送数据 InputMode 接收数据的类型:0为文本;1为二进制二、编程实现 从表1可以看到,MSCOMM可以两种不同的形式接收数据,即以文本形式和以二进制形式。用MSCOMM控件进行字符数据传输的文献和资料可以找到很多,在Microsoft的MSDN(Microsoft Developer Network)中就可以找到这样的例子,即VCTERM。可是几乎所有以单片机为核心的测量系统所得到的原始数据都是二进制形式的,所以,以二进制形式传输数据将是最为直接而又简洁的办法。不仅如此,由于MSCOMM控件在文本形式下,其传输的是宽字符格式的字符,要想得到有用信息,还要额外处理。因此本文主要讨论在二进制形式下的使用方法。 在VC++6.0中,用APPWizard可以生成三种应用程序:单文档(SDI)、多文档(MDI)和基于对话框的应用程序。为了说明问题和省去不必要的细节,下面以基于对话框的应用程序为例。 1.创建一个基于对话框的应用程序 打开VC++6.0集成开发环境,选择菜单项File/New,在出现的对话框中选中Projects标签中的MFC AppWizard(exe),然后在Project Name框中填入MyCOMM(可根据需要命名),之后点OK按钮。在接着出现的对话框中选中Dialog Based项,然后点NEXT按钮。以下的各对话框都按照缺省设置,这样即可生成一个基于对话框的应用程序。在资源编程器中会出现其对话框模板。 2.插入MSCOMM控件 选择菜单项Project/Add to project/Components and Controls…,在弹出的对话框中选择Registered ActiveX Controls文件夹下的Microsoft Communications Control,version6.0,然后按下Insert按钮,接着会弹出一个对话框,提示生成的类名及文件名,按OK按钮即可实现控件的插入。这时在对话框的控件工具栏 上会多出一个电话机模样的控件图标,Workspace的Classview中也多了一个类CMSComm。 此时即可将MSCOMM控件加入到对话框模板,加入方法与其他控件一样。然后还要在对话框类中相应加入一个成员变量,此处我们将其命名为m_comm。加入方法为:首先,在对话框模板中,用鼠标右键点击该控件,选择ClassWizard,在出现的对话框的Member Variables标签的Control Ids项下,选中IDC_MSCOMM1。然后,按Add Variable…按钮,在出现的对话框的Member Variable Name项中输入m_comm。最后,按OK按钮即可。 3.设置属性 可以在两个地方对控件的属性进行设置: (1)对话框资源编辑器中。在对话框模板上,用右键单击MSCOMM控件,然后选择Properties…菜单项,最后便可设置各项属性。此处只对以下几处进行改动,其他接受缺省设置:Rthershold:1,InputLen:1,DTREnable:不选,InputMode:1-Binary。 (2)对话框类的OnInitDialog()函数中。下面是以上设置的函数实现: BOOL CMyCOMMDlg::OnlnitDialog() { CDialog::OnlnitDialog(); //此处为应用框架自动生成代码,不予列出 //TODO:Add extra initialization here m_comm.SetCommPort(1);//使用串口1 m_comm.SetSettings("9600,N,8,1"); //波特率为9600,无奇偶校验,8位数据位,1位停止位 m_comm.SetRThreshold(10); //每接收10个字符就触发1次接收事件 m_comm.SetSThreshold(0); //不触发发送事件 m_comm.SetInputLen(10); //每次读操作从缓冲区中取10个字符 m_comm.SetInputMode(1); //二进制数据传输形式 m_comm.SetPortOpen(TRUE); //打开串口 return TRUE;//return TRUE unless you set the focus to a control } 4.发送二进制数据 如果需要发送二进制数据,可将数据作如下处理。具体代码如下: CByteArray bytOutArr; bytOutArr.Add(0x0); //给数组赋值 bytOutArr.Add(0x1); bytOutArr.Add(0x2); bytOutArr.Add(0x3); bytOutArr.Add(0x4); COleVariant varOut; varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型 m_comm.SetOutput (varOut); //发送数据 5.接收二进制数据 当需要接收大量的数据时,最好采用事件驱动方式进行编程。具体步骤如下: (1)响应OnComm事件。在对话框资源编程器中,双击对话框模板上的MSCOMM控件,在弹出的对话框中填入您所希望的事件响应函数名,此处将其命名为OnCommMscomm1()。 (2)在事件响应函数中接收和处理数据。接收来的数据为变体数据,所以需要做一些处理,具体代码如下: void CMyCOMMDlg::OnCommMscomm1() { COleVariant varRcv; CByteArray byt; int i; long num; switch (m_comm.GetCommEvent()) { cass 1://数据发送事件 break; case 2://数据接收事件 varRcv=m_comm.GetInput(); varRcv.ChangeType (VT_ARRAY |VT_UI1); BYTE HUGEP *pbstr; HRESULT hr; hr=SafeArrayAccessData (varRcv.parray,(void HUGEP*FAR*)%26;amp;pbstr);//获取安全数组指针 if (FAILED (hr)){ AfxMessageBox("获取数组指针失败!"); break;} num=0; hr=SafeArrayGetUBound (varRcv.parray,1,%26;amp;num);//获取数组上界 if (FAILED (hr)){ AfxMessageBox("获取数组上界失败!"); break;} for(i=0;i byt.Add(pbstr [i]); SafeArrayUnaccessData (varRcv.parray); //此时数据已保存在二进制数组byt中,可根据需要进行相关处理 break; default: break; } } 以上代码中的处理部分可以做成一个单独的函数,在此处调用即可。经过以上代码的处理,接收来的数据已存放在二进制数组byt中,可以根据自己的需要对其进行相关处理,如保存和显示等。 三、硬件接口 单片机与微机之间的硬件接口可以用1片MAX232或ICL232与几个电容即可实现,有许多文献讨论过,此处不再多述。 以上方法经过笔者在实践中的应用,感到非常简洁、方便,具有很强的实用意义。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

单片机是一种嵌入式系统,它是一块集成电路芯片,内部包含了处理器、存储器和输入输出接口等功能。

关键字: 单片机 编写程序 嵌入式

在现代电子技术的快速发展中,单片机以其高度的集成性、稳定性和可靠性,在工业自动化、智能家居、医疗设备、航空航天等诸多领域得到了广泛应用。S32单片机,作为其中的佼佼者,其引脚功能丰富多样,是实现与外部设备通信、控制、数据...

关键字: s32单片机引脚 单片机

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

该系列产品有助于嵌入式设计人员在更广泛的系统中轻松实现USB功能

关键字: 单片机 嵌入式设计 USB

单片机编程语言是程序员与微控制器进行交流的桥梁,它们构成了单片机系统的软件开发基石,决定着如何有效、高效地控制和管理单片机的各项资源。随着微控制器技术的不断发展,针对不同应用场景的需求,形成了丰富多样的编程语言体系。本文...

关键字: 单片机 微控制器

单片机,全称为“单片微型计算机”或“微控制器”(Microcontroller Unit,简称MCU),是一种高度集成化的电子器件,它是现代科技领域的关键组件,尤其在自动化控制、物联网、消费电子、汽车电子、工业控制等领域...

关键字: 单片机 MCU

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

在当前的科技浪潮中,单片机作为嵌入式系统的重要组成部分,正以其强大的功能和广泛的应用领域受到越来越多行业的青睐。在众多单片机中,W79E2051以其卓越的性能和稳定的工作特性,成为市场上的明星产品。本文将深入探讨W79E...

关键字: 单片机 w79e2051单片机

单片机,又称为微控制器或微处理器,是现代电子设备中的核心部件之一。它集成了中央处理器、存储器、输入输出接口等电路,通过外部信号引脚与外部设备进行通信,实现对设备的控制和管理。本文将详细介绍单片机的外部信号引脚名称及其功能...

关键字: 单片机 微控制器 中央处理器

随着科技的飞速发展,单片机和嵌入式系统在现代电子设备中的应用越来越广泛。它们不仅提高了设备的智能化水平,还推动了各行各业的创新与发展。在单片机和嵌入式系统的开发中,编程语言的选择至关重要。本文将深入探讨单片机和嵌入式系统...

关键字: 单片机 嵌入式系统 电子设备
关闭
关闭