陳式清 齊洪喜
(中船重工集團公司第七一〇研究所試驗站,上海 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
陳式清,男,江西贛州人,碩士,助理工程師,研究方向:軟件編程,電磁散射計算與仿真,微波信號分析與仿真,艦船物理場測量與計算。