一.
概述
在Visual Studio 6.0中編寫串口通訊程式,一般都使用Microsoft Communication Control(簡稱MSComm)的通訊控制項,只要通 過對此控制項的屬性和事件進行相應編程操作,就可以輕鬆地實現串口通訊。但在Microsoft.Net技術廣泛應用的今天,Visual Studio.Net沒有將此控制項加入控制項陳列庫,所以人們採用了許多方法在Visual Studio.Net來編寫串口通訊程式:第一種方法是通過採用Visual Studio 6.0中原來的MSComm控制項這是最簡單的,最方便的方法,但需要註冊;第二種方法是採用微軟在.NET推出了一個串口控制項,基於.NET的P/Invoke調用方法實現;第三種方法是自己用API寫串口通訊,雖然難度高,但可以方便實現自己想要的各種功能。
現在微軟推出了最新版本的Visual Studio 2005開發工具,可以不再採用第三方控制項的方法來設計串口通訊程式。NET Framework 2.0 類庫包含了SerialPort 類,方便地實現了所需要串口通訊的多種功能,為了使MSComm編程方法快速轉換到以SerialPort類為核心的串口通訊的設計方法,本文著重討論了Visual Studio 6.0的MSComm控制項和SerialPort 類設計方法的異同點。
二.SerialPort常用屬性、方法和事件
1.命名空間
System.IO.Ports命名空間包含了控制串口重要的SerialPort類,該類提供了同步 I/O 和事件驅動的 I/O、對管腳和中斷狀態的訪問以及對串列驅動程式屬性的訪問,所以在程式碼起始位置需加入Using System.IO.Ports。
2.串口的通訊參數
串口通訊最常用的參數就是通訊連接埠號碼及通訊格式(傳輸速率、資料位元、停止位和校正位),在MSComm中相關的屬性是CommPort和Settings。SerialPort類與MSComm有一些區別:
a.通訊連接埠號碼
[PortName]屬性擷取或設定通訊連接埠,包括但不限於所有可用的 COM 連接埠,請注意該屬性傳回型別為String,不是Mscomm.CommPort的short類型。通常情況下,PortName正常返回的值為COM1、COM2……,SerialPort類最大支援的連接埠數突破了CommPort控制項中CommPort屬性不能超過16的限止,大大方便了使用者串口裝置的配置。
b. 通訊格式
SerialPort類對分別用[BaudRate]、[Parity]、[DataBits]、[StopBits]屬性設定通訊格式中的傳輸速率、資料位元、停止位和校正位,其中[Parity]和[StopBits]分別是枚舉類型Parity、StopBits,Parity類型中枚舉了Odd(奇)、Even(偶)、Mark、None、Space,Parity枚舉了None、One、OnePointFive、Two。
SerialPort類提供了七個重載的建構函式,既可以對已經執行個體化的SerialPort對象設定上述相關屬性的值,也可以使用指定的連接埠名稱、傳輸速率和同位位元資料位元和停止位直接初始化 SerialPort 類的新執行個體。
3.串口的開啟和關閉
SerialPort類沒有採用MSComm.PortOpen=True/False設定屬性值開啟關閉串口,相應的是調用類的Open()和Close()方法。
4. 資料的發送和讀取
Serial類調用重載的Write和WriteLine方法發送資料,其中WriteLine可發送字串並在字串末尾加入分行符號,讀取串口緩衝區的方法有許多,其中除了ReadExisting和ReadTo,其餘的方法都是同步調用,線程被阻塞直到緩衝區有相應的資料或大於ReadTimeOut屬性設定的時間值後,引發ReadExisting異常。
5.DataReceived事件
該事件類別似於MSComm控制項中的OnComm事件,DataReceived事件在接收到了[ReceivedBytesThreshold]設定的字元個數或接收到了檔案結束字元並將其放入了輸入緩衝區時被觸發。其中[ReceivedBytesThreshold]相當於MSComm控制項的[Rthreshold]屬性,該事件的用法與MsComm控制項的OnComm事件在CommEvent為comEvSend和comEvEof時是一致的。
三.SerialPort的使用
對於熟悉MSComm控制項的程式設計者,SerialPort類是相當容易上手的。在進行串口通訊時,一般的流程是設定通訊連接埠號碼及傳輸速率、資料位元、停止位和校正位,再開啟連接埠串連,發送資料,接收資料,最後關閉連接埠串連這樣幾個步驟。
資料接收的設計方法在這裡比較重要,採用輪詢的方法比較浪費時間,在Visual Basic中的延時方法中一般會調用API並用DOEvents方法來處理,但程式不易控制,建議採用DataReceived事件觸發的方法,合理的設定ReceivedBytesThreshold的值,若接收的是定長的資料,則將ReceivedBytesThreshold設為接收資料的長度,若接收資料的結尾是固定的字元或字串則可採用ReadTo的方法或在DataReceived事件中判斷接收的字元是否滿足條件。
SerialPort類讀取資料的許多方法是同步阻塞調用,盡量避免在主線程中調用,可以使用非同步處理或線程間處理調用這些讀取資料的方法。
由於DataReceived事件在輔線程被引發,當收到完整的一條資料,返回主線程處理或在表單上顯示時,請注意跨線程的處理,C#可採用控制項非同步委託的方法Control.BeginInvoke及同步委託的方法Invoke。
四.結束語
在.NET平台下熟練使用SerialPort 類,可以很好地開發出串口通訊類程式,對於過去使用MSComm控制項設計了一些通訊程式,也可以將MSComm控制項替換為SerialPort類,當然為了避免對以前的項目做大的改動,可以使用SerialPort類設計一些與MSComm控制項具有相同介面的類,在今後工業控制中,SerialPort類將廣泛地應用於串口通訊程式的設計中,發揮著與MSComm控制項一樣的作用。