陳式清 齊洪喜
(中船重工集團(tuán)公司第七一〇研究所試驗(yàn)站,上海 201900)
.NET與LabVIEW混合環(huán)境的一種串口通信編程
陳式清 齊洪喜
(中船重工集團(tuán)公司第七一〇研究所試驗(yàn)站,上海 201900)
針對(duì)使用LabVIEW在編程開發(fā)串口通信過程中遇到的不足,本文提出基于在.NET與LabVIEW混合環(huán)境下編程開發(fā)串口通信的方法。該方法主要采用串口收發(fā)觸發(fā)中斷事件,優(yōu)點(diǎn)是代碼量少、方法簡潔、效率高。在實(shí)際工程運(yùn)用過程中,開發(fā)人員可以綜合利用.net與LabVIEW的優(yōu)勢來解決串口通信開發(fā)因?yàn)長abVIEW環(huán)境造成的不足。
串口通信;.net;LabVIEW;Visa;C#;mscom32.ocx;vi
眾所周知串口通信在工業(yè)控制,信號(hào)和數(shù)據(jù)的收發(fā)傳輸,設(shè)備檢查、調(diào)試、維修等方面都發(fā)揮著重要的作用,有大量各行各業(yè)的工業(yè)設(shè)備采用了串口通信的方式工作。Lab-VIEW環(huán)境下提供的串口編程是利用National Instruments的VISA實(shí)現(xiàn)的,它的不足之處在于只能實(shí)現(xiàn)輪詢方式的數(shù)據(jù)收發(fā),無法實(shí)現(xiàn)中斷方式的數(shù)據(jù)收發(fā)。我們知道如果程序在不斷地一直輪詢,串口將會(huì)占用大量不必要的cpu系統(tǒng)資源,使得程序效率低下。這對(duì)運(yùn)行單獨(dú)的運(yùn)算量較小的中、小型應(yīng)用程序,且只有少量的串口通信時(shí),是可以很好地滿足要求。但是如果一個(gè)應(yīng)用程序里面很多時(shí)候可能包含了10幾個(gè)串口數(shù)據(jù)收發(fā)甚至是20幾個(gè)串口數(shù)據(jù)收發(fā),如果每個(gè)串口都在不停地輪詢,并且應(yīng)用程序中還有高頻數(shù)據(jù)采集和信號(hào)處理程序的話,LabVIEW環(huán)境下的串口通信VISA實(shí)現(xiàn)就無法滿足實(shí)際需求了。
這時(shí)大家通常的做法是放棄LabVIEW環(huán)境下的VISA實(shí)現(xiàn),而是在LabVIEW環(huán)境加入微軟的一個(gè)串口通信com組件mscom32.ocx。這個(gè)ocx文件是一個(gè)ActivX組件,這種做法和以往在VB6.0或CV6.0下的串口通信沒有什么區(qū)別,都是在開發(fā)環(huán)境中加入這個(gè)mscom32.ocx的ActivX組件來實(shí)現(xiàn)中斷方式編程。但是這個(gè)com組件的使用比較復(fù)雜,實(shí)現(xiàn)的代碼量也比較多,需要有足夠經(jīng)驗(yàn)的開發(fā)人員根據(jù)微軟提供的mscom32.ocx使用文檔進(jìn)行這部分的開發(fā)。這部分的內(nèi)容如果使用LabVIEW來編寫的話會(huì)顯得復(fù)雜而凌亂,不利于日后的項(xiàng)目維護(hù)。因此本文提出一種不需要使用mscom32.ocx組件來實(shí)現(xiàn)中斷方式通信的編程方法。
.net的開發(fā)環(huán)境:Microsoft Visual Studio 2008,編程語言:C#;LabVIEW的開發(fā)環(huán)境:National Instruments Lab-VIEW 2010;操作系統(tǒng):windows XP或windows 7.0。
我們知道,在.net框架的C#開發(fā)環(huán)境內(nèi)集成了很多的窗口控件,比如:按鈕、文本框、下拉框等,在軟件開發(fā)的時(shí)候只需要將這些工具直接拖到窗體上就可以自動(dòng)生成相應(yīng)的代碼。對(duì)于C#的串口通信編程,它也同樣提供了類似于按鈕、文本框控件一樣可以直接拖放的串口工具。我們編程時(shí)只需要簡單地拖放控件、設(shè)置控件屬性,實(shí)現(xiàn)一下事件代碼就可以了。
2.1 實(shí)現(xiàn)邏輯
為了描述方便,將原始中斷事件用小細(xì)圓圈表示,封裝后的事件用大粗圓圈表示。當(dāng)串口數(shù)據(jù)通過串口線路進(jìn)入設(shè)備的串口硬件,操作系統(tǒng)的串口驅(qū)動(dòng)做出相應(yīng)的響應(yīng),在C#的串口控件中封裝了所有的這些響應(yīng),我們只要按特定的需求進(jìn)行相應(yīng)的設(shè)置,即可實(shí)現(xiàn)這些響應(yīng)的處理。接收邏輯與發(fā)送邏輯分別如下圖1、圖2所示:
圖1 混合環(huán)境下的串口通信接收邏輯圖
圖2 混合環(huán)境下的串口通信發(fā)送邏輯圖
2.2 .net環(huán)境部分的實(shí)現(xiàn)
本文設(shè)計(jì)中沒有將硬件觸發(fā)的中斷事件直接交給Lab-VIEW,而是創(chuàng)建一個(gè)新的事件,讓LabVIEW環(huán)境去訂閱(或叫注冊)這個(gè)新的事件。這樣做的好處是在C#端和在Lab-VIEW端都有機(jī)會(huì)處理這個(gè)事件,這樣就可以結(jié)合這兩個(gè)環(huán)境的優(yōu)點(diǎn)將一部分處理仿在C#中,處理完后再交由Lab-VIEW處理。
筆者項(xiàng)目中使用了20個(gè)串口控件,為了簡化編程任務(wù),這里采用了一個(gè)技巧,即C#端將一個(gè)窗口封裝在dll中(使用時(shí)只需創(chuàng)建這個(gè)窗體,而不顯示這個(gè)窗體),在該窗口內(nèi)直接拖放20個(gè)串口控件,然后編寫相應(yīng)的源代碼(這里需要注意在編譯項(xiàng)目的時(shí)候需要選擇編譯成動(dòng)態(tài)鏈接庫,而不是windows應(yīng)用程序)。如下圖3所示:
圖3 直接拖放的20個(gè)串口控件
部分核心代碼:---
//根據(jù)readMsg的值進(jìn)行C#端的處理
。。。。//這里省略的部分為需要加入的C#端的數(shù)據(jù)處理
//這里處理完C#端后,發(fā)給LabVIEW端處理,GotDate在LabVIEW中已經(jīng)訂閱
RaiseGotDate(new MyEventArgs(readMsg,serialPort1.PortName));
}
上面代碼中GotDate為創(chuàng)建的新事件,用它來封裝串口接收事件,它將在LabVIEW端被訂閱。serialPort1_DataReceived為串口硬件接收中斷事件的處理函數(shù),其它串口的事件處理函數(shù)和該函數(shù)類似,可以命名為serialPort2_DataReceived、serialPort3_DataReceived等等。RaiseGotDate為觸發(fā)LabVIEW端處理串口事件的事件觸發(fā)函數(shù)。
串口數(shù)據(jù)發(fā)送實(shí)現(xiàn)相對(duì)簡單,函數(shù)簽名如下:
public void SerialPortSend(string sendData,string com)
2.3 LabVIEW環(huán)境部分的實(shí)現(xiàn)
因?yàn)橹饕拇谕ㄐ胚壿嫸家言贑#端實(shí)現(xiàn),在Lab-VIEW端只需要調(diào)用C#端的構(gòu)造函數(shù)來構(gòu)造這個(gè)串口集合對(duì)象(這是實(shí)現(xiàn)混合編程的關(guān)鍵,方法是:打開LabVIEW的程序框圖面板,然后鼠標(biāo)右鍵打開函數(shù)面板,進(jìn)入“互聯(lián)接口》.net》...”,這里都是供LabVIEW調(diào)用.net函數(shù)的節(jié)點(diǎn)),對(duì)于事件處理,只需要注冊該事件和編寫事件回調(diào)子vi函數(shù),對(duì)其它的非事件功能調(diào)用,只需要通過C#的對(duì)象句柄引用利用LabVIEW的“調(diào)用節(jié)點(diǎn)”直接調(diào)用C#中的函數(shù)。主要的程序?qū)崿F(xiàn)框圖如下:
圖4 直接調(diào)用C#端的關(guān)閉所有串口函數(shù)
圖5 直接調(diào)用C#端的發(fā)送串口信息函數(shù)
圖6 直接調(diào)用C#端的打開所有串口函數(shù)
圖7 清空接收文本框內(nèi)顯示的串口數(shù)據(jù)
圖8 串口接收回調(diào)子vi函數(shù)
圖9 軟件測試界面運(yùn)行效果
采用本文方法開發(fā)的項(xiàng)目經(jīng)測試表明響應(yīng)速度比過去有明顯的提高,在大數(shù)據(jù)量收發(fā)過程中CPU占用率≤10%,并且如果單純采用LabVIEW開發(fā)相同功能的項(xiàng)目,我們發(fā)現(xiàn)往往是vi框圖要么龐大而混亂,要么就是子vi眾多。而采用本文方法進(jìn)行項(xiàng)目開發(fā)后變得結(jié)構(gòu)清晰、邏輯簡單、代碼量少,vi框圖一目了然,大大提升了項(xiàng)目后期的易維護(hù)性和易擴(kuò)展性。
[1]王定遠(yuǎn),胡吉朝,李媛.基于MScomm32和LabVIEW的串口通信技術(shù)[J].國外電子測量技術(shù),2006,(04).
[2]任麗麗,張志杰.基于LABVIEW的串口數(shù)據(jù)采集系統(tǒng)[J].微計(jì)算機(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
陳式清,男,江西贛州人,碩士,助理工程師,研究方向:軟件編程,電磁散射計(jì)算與仿真,微波信號(hào)分析與仿真,艦船物理場測量與計(jì)算。