天天看點

使用SerialPort類設計序列槽通訊程式 (VS2005)

一.概述

在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控件一樣的作用。

本文來自CSDN部落格,轉載請标明出處:http://blog.csdn.net/jiangxinyu/archive/2009/08/05/4412120.aspx

轉載于:https://www.cnblogs.com/xgw2004058/archive/2010/06/21/1761966.html