陈式清 齐洪喜
(中船重工集团公司第七一〇研究所试验站,上海 201900)
.NET与LabVIEW混合环境的一种串口通信编程
陈式清 齐洪喜
(中船重工集团公司第七一〇研究所试验站,上海 201900)
针对使用LabVIEW在编程开发串口通信过程中遇到的不足,本文提出基于在.NET与LabVIEW混合环境下编程开发串口通信的方法。该方法主要采用串口收发触发中断事件,优点是代码量少、方法简洁、效率高。在实际工程运用过程中,开发人员可以综合利用.net与LabVIEW的优势来解决串口通信开发因为LabVIEW环境造成的不足。
串口通信;.net;LabVIEW;Visa;C#;mscom32.ocx;vi
众所周知串口通信在工业控制,信号和数据的收发传输,设备检查、调试、维修等方面都发挥着重要的作用,有大量各行各业的工业设备采用了串口通信的方式工作。Lab-VIEW环境下提供的串口编程是利用National Instruments的VISA实现的,它的不足之处在于只能实现轮询方式的数据收发,无法实现中断方式的数据收发。我们知道如果程序在不断地一直轮询,串口将会占用大量不必要的cpu系统资源,使得程序效率低下。这对运行单独的运算量较小的中、小型应用程序,且只有少量的串口通信时,是可以很好地满足要求。但是如果一个应用程序里面很多时候可能包含了10几个串口数据收发甚至是20几个串口数据收发,如果每个串口都在不停地轮询,并且应用程序中还有高频数据采集和信号处理程序的话,LabVIEW环境下的串口通信VISA实现就无法满足实际需求了。
这时大家通常的做法是放弃LabVIEW环境下的VISA实现,而是在LabVIEW环境加入微软的一个串口通信com组件mscom32.ocx。这个ocx文件是一个ActivX组件,这种做法和以往在VB6.0或CV6.0下的串口通信没有什么区别,都是在开发环境中加入这个mscom32.ocx的ActivX组件来实现中断方式编程。但是这个com组件的使用比较复杂,实现的代码量也比较多,需要有足够经验的开发人员根据微软提供的mscom32.ocx使用文档进行这部分的开发。这部分的内容如果使用LabVIEW来编写的话会显得复杂而凌乱,不利于日后的项目维护。因此本文提出一种不需要使用mscom32.ocx组件来实现中断方式通信的编程方法。
.net的开发环境:Microsoft Visual Studio 2008,编程语言:C#;LabVIEW的开发环境:National Instruments Lab-VIEW 2010;操作系统:windows XP或windows 7.0。
我们知道,在.net框架的C#开发环境内集成了很多的窗口控件,比如:按钮、文本框、下拉框等,在软件开发的时候只需要将这些工具直接拖到窗体上就可以自动生成相应的代码。对于C#的串口通信编程,它也同样提供了类似于按钮、文本框控件一样可以直接拖放的串口工具。我们编程时只需要简单地拖放控件、设置控件属性,实现一下事件代码就可以了。
2.1 实现逻辑
为了描述方便,将原始中断事件用小细圆圈表示,封装后的事件用大粗圆圈表示。当串口数据通过串口线路进入设备的串口硬件,操作系统的串口驱动做出相应的响应,在C#的串口控件中封装了所有的这些响应,我们只要按特定的需求进行相应的设置,即可实现这些响应的处理。接收逻辑与发送逻辑分别如下图1、图2所示:
图1 混合环境下的串口通信接收逻辑图
图2 混合环境下的串口通信发送逻辑图
2.2 .net环境部分的实现
本文设计中没有将硬件触发的中断事件直接交给Lab-VIEW,而是创建一个新的事件,让LabVIEW环境去订阅(或叫注册)这个新的事件。这样做的好处是在C#端和在Lab-VIEW端都有机会处理这个事件,这样就可以结合这两个环境的优点将一部分处理仿在C#中,处理完后再交由Lab-VIEW处理。
笔者项目中使用了20个串口控件,为了简化编程任务,这里采用了一个技巧,即C#端将一个窗口封装在dll中(使用时只需创建这个窗体,而不显示这个窗体),在该窗口内直接拖放20个串口控件,然后编写相应的源代码(这里需要注意在编译项目的时候需要选择编译成动态链接库,而不是windows应用程序)。如下图3所示:
图3 直接拖放的20个串口控件
部分核心代码:---
//根据readMsg的值进行C#端的处理
。。。。//这里省略的部分为需要加入的C#端的数据处理
//这里处理完C#端后,发给LabVIEW端处理,GotDate在LabVIEW中已经订阅
RaiseGotDate(new MyEventArgs(readMsg,serialPort1.PortName));
}
上面代码中GotDate为创建的新事件,用它来封装串口接收事件,它将在LabVIEW端被订阅。serialPort1_DataReceived为串口硬件接收中断事件的处理函数,其它串口的事件处理函数和该函数类似,可以命名为serialPort2_DataReceived、serialPort3_DataReceived等等。RaiseGotDate为触发LabVIEW端处理串口事件的事件触发函数。
串口数据发送实现相对简单,函数签名如下:
public void SerialPortSend(string sendData,string com)
2.3 LabVIEW环境部分的实现
因为主要的串口通信逻辑都已在C#端实现,在Lab-VIEW端只需要调用C#端的构造函数来构造这个串口集合对象(这是实现混合编程的关键,方法是:打开LabVIEW的程序框图面板,然后鼠标右键打开函数面板,进入“互联接口》.net》...”,这里都是供LabVIEW调用.net函数的节点),对于事件处理,只需要注册该事件和编写事件回调子vi函数,对其它的非事件功能调用,只需要通过C#的对象句柄引用利用LabVIEW的“调用节点”直接调用C#中的函数。主要的程序实现框图如下:
图4 直接调用C#端的关闭所有串口函数
图5 直接调用C#端的发送串口信息函数
图6 直接调用C#端的打开所有串口函数
图7 清空接收文本框内显示的串口数据
图8 串口接收回调子vi函数
图9 软件测试界面运行效果
采用本文方法开发的项目经测试表明响应速度比过去有明显的提高,在大数据量收发过程中CPU占用率≤10%,并且如果单纯采用LabVIEW开发相同功能的项目,我们发现往往是vi框图要么庞大而混乱,要么就是子vi众多。而采用本文方法进行项目开发后变得结构清晰、逻辑简单、代码量少,vi框图一目了然,大大提升了项目后期的易维护性和易扩展性。
[1]王定远,胡吉朝,李媛.基于MScomm32和LabVIEW的串口通信技术[J].国外电子测量技术,2006,(04).
[2]任丽丽,张志杰.基于LABVIEW的串口数据采集系统[J].微计算机信息,2008,(07).
AKind of Serial Communication Programming with.NET and LabVIEW
Chen Shinqing Qi Hongxi
(710 Institute ShangHai Test Station,The Chinese Heavy Industry Group CO.,Shanghai 201900)
Aiming at the deficiency of LabVIEW used in the development of serial Communication,this paper puts forward a programming method based on.net mixed with LabVIEW.It triggers the interrupt events mainly with the serial port,having the advantage of less code,simple method and high efficiency.In the practical project,this method can solve the deficiency of programming with LabVIEW efficiently.
serial communication;.net;LabVIEW;Visa;C#;mscom32.ocx;vi
陈式清,男,江西赣州人,硕士,助理工程师,研究方向:软件编程,电磁散射计算与仿真,微波信号分析与仿真,舰船物理场测量与计算。