基于MScomm32和LabVIEW的串口通信技术MSComm-LV

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于MScomm32和LabVIEW的串口通信技术王定远1,胡吉朝2,李媛3(河北科技大学信息学院石家庄050054)摘要:串行通信是一种常用的数据传输方法,它用于计算机与外设,或者计算机与计算机之间的通信。本文针对串口通信技术,详细介绍了串口通信控件MSCOMM32.OCX在LabVIEW7.1下的使用方法,并介绍了串行通信中断接收及数据处理的技巧。作者已经把该技术成功运用到了部队和工业控制的实际项目中。关键词:串行通信中断ACTIVEXMSCOMM32.OCXLabVIEWTheSerialcommunicationtechniqueBasedonMSCOMM32andLabVIEW7.1(WangDingyuan,HuJichao,LiYuan)(CollegeofInformationScienceandEngineering,HebeiUniversityofscienceandTechnology,ShijiazhuangHebei050054,China)Abstract:Serialcommunicationisacommon-usedmethodtotransferthedata,itcanbeusedinthecommunicationbetweenthecomputerandtheperipheralequipment,orbetweenthecomputerandthecomputer(twocomputers).ThispaperintroducesthewayhowtousetheMSCOMM32.OCXintheLabVIEW7.1,whichisakindofcontrolusedintheserialcommunication.,andintroducedtheskillofhowtomanagethedatainterruptreceptionandthedataprocession.Wehaveputthistechniqueintotheactualitemofarmyandtheindustrycontrolsuccessfully.KeyWord:SerialcommunicationInterruptACTIVEXMSCOMM32.OCXLabVIEW1前言工业控制中,串口是常用的计算机与外部串行设备之间的数据传输通道。大多数计算机和许多仪器都配有RS-232接口,使得串行通信非常方便和流行。MSCOMM32.OCX是一个专门用于串口通信的ACTIVEX控件,它提供了使用RS-232来进行数据通信的所有协议,常用的代码式编程语言(如:VC++、VB、DELPHI等)为该控件提供了标准的事件处理函数、过程,并通过属性和方法提供了串行通信的设置。它使用户能够方便地访问Windows串行通信驱动程序的大多数特性,包括输入、输出缓冲区的大小及决定何时使用流控制命令挂起数据传输等,使得此控件在工业控制上需要串行通信的场合变得流行起来。LabVIEW是美国国家仪器公司开发的一种图形化编程语言,专门用于计算机测控技术。LabVIEW内置了串口通信的8个功能函数,可以分别实现串口初始化、串口写、串口读、检测串口缓存、中断以及关闭串口等功能。这6个节点函数容易理解,故得到了大多数工程师的使用。但是,比较而言,MSCOMM32控件更好,因为它有中断函数处理功能,可以实现中断式的接收数据,而LabVIEW自带的串口通信功能节点却只可以实现查询式的数据接收。查询方式,即一个进程中的某一线程定时地查询串口的接收缓冲区,如果缓冲区中有数据,就读取数据;若缓冲区中没有数据,该线程将继续执行,因此会占用大量的CPU时间。在一些实时性要求高的场合,采用查询处理不符合现场需要。另外,由于MSCOMM32控件可以单独设置串口的每一个引脚,便于实现高级的用户自定义功能,而LabVIEW自带的串口通信节点却无法实现。鉴于MSCOMM32的一些优点,本论文将详细介绍在LabVIEW7.1的环境下如何使用MSCOMM32来开发带有中断数据接收功能的串口通信程序。这也是作者长期处理串口通信技术的一个经验总结。2中断式串口通信技术的实现2.1MSCOMM32控件的使用思想MSComm控件共有27个属性。使用前一定要对常用的属性进行设置。指定串口号,设置通信参数,指定接收缓冲区大小,清空接收缓冲区,设置数据获取方式,设置读取方式,打开指定的串口。打开所需串口后,就考虑串口通信的时机。在接收或发送数据过程中,可能需要监视并响应一些事件和错误,所以事件驱动是处理串行端口交互作用的一种非常有效的方法。使用OnComm事件和CommEvent属性捕捉并检查通信事件和错误的值。发生通信事件或错误时将触发OnComm事件,CommEvent属性的值将被改变,应用程序通过检查CommEvent属性值并作出相应的反应。串口的中断需要通过RegisterForEvents来注册中断事件,串口使用完毕需要关闭串口,通过UnregisterForEvents撤销对中断节点的注册,并通过CloseReference关闭ActiveX自动化控件。2.2在LabVIEW中加载MSCOMM32.OCX控件MSCOMM32.OCX控件是一种ACTIVEX控件。ACTIVEX采用客户机/服务器模式进行不同应用程序的链接,调用其它应用程序的对象时,这个应用程序被作为客户端。自己创建的对象被其它应用程序调用时,这个应用程序被用作服务器。LabVIEW既可以作为ACTIVEX采用客户端,又可以作为ACTIVEX服务器。在这里我们使用LabVIEW作为客户端进行ACTIVEX的调用。LabVIEW提供有加载外部AXTIVEX控件的功能,使用前需把MSCOMM32.OCX控件加载到LabVIEW环境中。在LabVIEW的工具菜单“ToolsAdvancedImportActiveXControls”将Microsoft的串口控件-“MicrosoftCommunicationsControl,version6.0”添加到LabVIEW环境中,存放在缺省路径即可,这样在UserControlsPalette里面就可以找到这个控件。图1添加ActiveX控件图2选择MSCOMM32控件2.3MSCOMM32控件初始化将串口控件(电话机符号)放置在FrontPanel上,在框图程序中用控件属性就可以对其进行编程,实现所需要的功能。在实际操作的时候,一个串口资源只可以有一个MSCOMM控件与之相对应,如果在一个程序中同时需要进行多个串口的通信,则必须调出多个MSCOMM控件进行编程。首先把LabVIEW中切换到框图程序环境,可以发现一个带有MSCOMM字样的控件。现在就可以按照VC++等代码式编程语言的编程思想,对此控件进行属性的配置。在ALLFUNCTIONSCOMMUNICATIONACTIVEX下,调出PropertyNode节点,放于BlockDiagram中。如果把其Refnum和MSCOMM32控件的Refnum相联接,就可以发现其对应的所有属性函数,只要按照要求设置其属性,就可以操作这个控件了。图3放置控件图4MSCOMM32的属性函数图5MSCOMM32控件的初始化2.4数据的发送和接收MSCOMM32控件可以接收二进制字节型数据或者字符串,这个可以通过InputMode属性设置,0默认为ComInputModeText,1为ComInputModeBinary。使用output函数发送数据,使用input函数接收接收数据。在数据的发送和接收前的串口初始化程序里需要提前设置好发送缓存和接收缓存的大小,控件默认为InBufferSize=1024BYTE,OutBufferSize=512BYTE。RThreshold为接收中断门槛,默认为0,表示不产生中断,此时程序的编写采用查询式通信,如果设置为其它整数,比如1,则接收缓冲区每收到一个字符就会产生中断,SThreshold为发送中断门槛,若设为0,不产生中断,若为1,则当传输缓冲区完全空时,控件产生中断事件。在本论文中,为了实现接收中断方式的串口通信,需要把SThreshold设为0,RThreshold设置为1。在发送数据时,如果是静态数据,可以直接通过一个HexString的常数与数据发送区联接,或者通过一个10进制的常量经NumerictoHexString的转换送数据发送区;如果是动态数据,比如:D7H、F5H、00H、01H,则需要通过字节型数组进行数据的转换后,进行发送。作者在作串口通信程序时,采用了以下的方法:先构造一个10进制数的数组215、245、0、1,然后通过ByteArraytoString函数转换数据类型,再紧接着使用StringtoByteArray函数节点,然后再通过ToVariant节点把ByteArray函数转换成Variant类型送入数据发送区,则即相当于把D7H、F5H、00H、01H这4个字节的数据发送出去了。切记,一定按照这个原则,否则数据发送不出去,或则不正确。VarianttoData节点和ToVariant节点存放在在ALLFUNCTIONSCOMMUNICATIONACTIVEX下。数据接收的时候,通过VarianttoData节点把变体数据转换成LabVIEW可以显示的数据类型,如果是字节型数组就设置转换为ByteArray类型;如果是字符型数据,就转换成String格式。2.5中断方式的使用本论文中提到的中断处理包括了2层含义,第一是程序的编写采用了LabVIEW自带的事件处理机制控件,即使用事件机制响应按钮操作,第二是串口通信数据接收采用中断方式处理。先介绍一下LabVIEW的事件处理机制。EventStructure位于Function模板Structure子模板中。当没有任何事件发生时,就会处于睡眠状态,直到有一个或多个预先设定的事件发生时,EventStructure才会自动苏醒,并根据发生的事件执行用户预先设定的动作。本论文就采用了若干个按钮,来发送不同的命令字,LabVIEW的中级程序员对此已经很熟悉,在此就不再详述。在LabViEW中操作AXTIVEX使用中断函数是通过RegEventCallback节点来实现的,使用这个节点需要对它进行配置。在编程时,先把它的Event管脚与MSCOMM32的Refum相联接,这时RegEventCallback节点就会含有MSCOMM32的中断函数OnComm的信息了。下一个关键的步骤就是设定并配置中断服务程序了。这时,右键点击RegEventCallback节点的VIRef管脚,选择CreatCallBackVI,则程序自动生成一个中断函数的子VI和VIRef管脚相联。然后,双击这个子VI,进入其后面的程序框图,编辑自己需要的中断服务程序。作者设计了一个接收数据的中断服务处理。把MSCOMM32的COMMEVENT属性函数的VIRef与Controlref相联,在后面使用一个CASE结构进行判别和处理。因Oncomm=2时为接收中断,则把CASE2设置为DefaultCASE,再在其结构内部通过一个Input函数把数据读出来,用VariantToData节点把数据变为想要的数据类型,在这里作者把它设置为了字节型数组类型。中断服务程序就编写完毕。这个接收的数据可以设置为全局变量,从而把数值送到主程序进行显示。这样,平时没有数据接收时,程序处于睡眠状态,当有接收数据超过了接收中断门槛,就会产生中断服务,把接收到的数据传到主程序进行显示出来。如果直接显示接收到的数据,那么是10进制的字节型数组;如果把字节型数组再通过ByteArraytoString节点进行数据类型转换,就可以显示为16进制的字符串。此时,若在主程序中对接收到数据进行判别和处理,就可以做出适合各种用途的串口通信程序了。图6MSCOMM32控件的字节型数据发送图7RegEventCallback节点的使用图

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功