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