




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Ø 使用SerialPort類設計串口通訊程一 概述 輸送帶控制模塊的核心技術是與PLC的串口通訊,在Visual Studio 6.0中編寫串口通訊程序,一般都使用Microsoft Communication Control(簡稱MSComm)的通訊控件,只要通過對此控件的屬性和事件進行相應編程操作,就可以輕松地實現串口通訊。但在Microsoft.Net技術廣泛應用的今天,Visual Studio.Net沒有將此控件加入控件庫,所以人們采用了許多方法在Visual Studio.Net來編寫串口通訊程序:第一種方法是通過采用Visual Studio 6.0中原來的MSCom
2、m控件這是最簡單的,最方便的方法,但需要注冊;第二種方法是采用微軟在.NET推出了一個串口控件,基于.NET的P/Invoke調用方法實現;第三種方法是自己用API寫串口通信,雖然難度高,但可以方便實現自己想要的各種功能。 現在微軟推出了最新版本的Visual Studio 2005開發工具,可以不再采用第三方控件的方法來設計串口通訊程序。NET Framework 2.0 類庫包含了SerialPort 類,方便地實現了所需要串口通訊的多種功能,為了使MSComm編程方法快速轉換到以SerialPort類為核心的串口通訊的設計方法,這里著重討論了Visual Studio 6.0的MSCom
3、m控件和SerialPort 類設計方法的異同點。二SerialPort常用屬性、方法和事件 1命名空間System.IO.Ports命名空間包含了控制串口重要的SerialPort類,該類提供了同步 I/O 和事件驅動的 I/O、對管腳和中斷狀態的訪問以及對串行驅動程序屬性的訪問,所以在程序代碼起始位置需加入Using System.IO.Ports。2串口的通訊參數串口通訊最常用的參數就是通訊端口號及通訊格式(波特率、數據位、停止位和校驗位),在MSComm中相關的屬性是CommPort和Settings。SerialPort類與MSComm有一些區別:Ø
4、 通訊端口號 PortName屬性獲取或設置通信端口,包括但不限于所有可用的 COM 端口,請注意該屬性返回類 型為String,不是Mscomm.CommPort的short類型。通常情況下,PortName正常返回的值為COM1、COM2,SerialPort類最大支持的端口數突破了CommPort控件中CommPort屬性不能超過16的限止,大大方便了用戶串口設備的配置。Ø 通訊格式 SerialPort類對分別
5、用BaudRate、Parity 、 DataBits、StopBits屬性設置通訊格式中的波特率、校驗位、數據位和停止位,其中Parity和StopBits分別是枚舉類型Parity、StopBits,Parity類型中枚舉了Odd(奇)、Even(偶)、Mark、None、Space,Parity枚舉了None、One、OnePointFive、Two。 SerialPort類提供了七個重載的構造函數,既可以對已經實例化的SerialPort對象設置上述相關屬性的值,也可以使用指定的端口名稱、波特率和奇偶校驗位數據位和停止位直接初始化 SerialPort 類的新實例。3串口的打開和關閉
6、SerialPort類沒有采用MSComm.PortOpen=True/False設置屬性值打開關閉串口,相應的是調用類的Open()和Close()方法。 4. 數據的發送和讀取 SerialPort類調用重載的Write和WriteLine方法發送數據,其中WriteLine可發送字符串并在字符串末尾加入換行符,讀取串口緩沖區的方法有許多,其中除了ReadExisting(讀取 SerialPort 對象的流和輸入緩沖區中所有立即可用的字節)和ReadTo(一直讀取到輸入緩沖區中的指定 value 的字符串),其余的方法都是同步調用,線程被阻塞直到緩沖區有相應的數據或大于ReadTimeO
7、ut屬性設定的時間值后,引發ReadExisting異常。5. DataReceived事件 該事件類似于MSComm控件中的OnComm事件,DataReceived事件在接收到了ReceivedBytesThreshold設置的字符個數或接收到了文件結束字符并將其放入了輸入緩沖區時被觸發。其中ReceivedBytesThreshold相當于MSComm控件的Rthreshold屬性,該事件的用法與MsComm控件的OnComm事件在CommEvent為comEvSend和comEvEof時是一致的。三SerialPort的使用 對于熟悉MSComm控
8、件的程序設計者,SerialPort類是相當容易上手的。在進行串口通訊時,一般的流程是設置通訊端口號及波特率、數據位、停止位和校驗位,再打開端口連接,發送數據,接收數據,最后關閉端口連接這樣幾個步驟。 SerialPort類讀取數據的許多方法是同步阻塞調用,盡量避免在主線程中調用,可以使用異步處理或線程間處理調用這些讀取數據的方法。 由于DataReceived事件在輔線程被引發,當收到完整的一條數據,返回主線程處理或在窗體上顯示時,請注意跨線程的處理,C#可采用控件異步委托的方法Control.BeginInvoke及同步委托的方法Invoke。1以添加
9、控件的方式(有用戶界面) VB:1) 從工具箱選擇SerialPort控件添加到窗體上,命名為SpCom 。2) 設置通訊端口號及波特率、數據位、停止位和校驗位。 SpCom.PortName = "COM1" SpCom.BaudRate = 9600 SpCom.Parity = IO.Ports.Parity.None SpCom.DataBits = 8 SpCom.StopB
10、its = IO.Ports.StopBits.One3) 發送數據 SpCom.Write(TextSendData.Text)4) 添加接受事件 Private Sub SpCom_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SpCom.Data
11、Received5) 讀取數據 Dim strT As String strT = SpCom.ReadExisting()C:1) 從工具箱選擇SerialPort控件添加到窗體上,命名為SpCom 。2) 設置通訊端口號及波特率、數據位、停止位和校驗位。 SpCom.PortName = "COM
12、1" SpCom.BaudRate = 9600; SpCom.Parity = IO.Ports.Parity.None; SpCom.DataBits = 8; SpCom.StopBits = IO.Ports.StopBits.One;3) 發送數據 SpCom.Write(TextSendData.Text) ;4) 添加接受事件 private void serialPortCom2
13、_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)5) 讀取數據 String strT; strT=SpCom.ReadExisting();2以類的方式 VB:1) 定義SerialPort類實例 Dim SpCom As New System.IO.Ports.SerialPort()2)
14、 設置通訊端口號及波特率、數據位、停止位和校驗位。 SpCom.PortName = "COM1" SpCom.BaudRate = 9600 SpCom.Parity = IO.Ports.Parity.None SpCom.DataBits = 8 SpCom.StopBits = IO.Ports.StopBits.One 或是定義時直接初始化 Dim SpCom As New System.IO.Ports.SerialPort("COM1", 9600, IO.
15、Ports.Parity.Even, 8, IO.Ports.StopBits.None)3) 發送數據 SpCom.Write(TextSendData.Text)4) 添加接受事件a) 在運行時將事件與事件處理程序相關聯AddHandler SpCom.DataReceived, AddressOf EventRece
16、iveData說明:AddressOf 創建引用特定過程的過程委托實例AddressOf 運算符可以用作委托構造函數的操作數,或可以用在編譯器能夠確定委 托類型的上下文中。b) 添加事件處理程序(簽名一定要一致) Sub EventReceiveData(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)5)
17、讀取數據 Dim strT As String strT = SpCom.ReadExisting()C:1) 添加引用 using System.IO.Ports;2) 定義SerialPort類實例 private SerialPort SpCom2 = new SpCom ("COM2", 9600,Parity.None, 8, StopBits.One);3)
18、160; 設置通訊端口號及波特率、數據位、停止位和校驗位。 SpCom.PortName = "COM1" SpCom.BaudRate = 9600; SpCom.Parity = IO.Ports.Parity.None; SpCom.DataBits = 8; SpCom.StopBits = IO.Ports.StopBits.One; 或是定義時直接初始化 private SerialPort SpCom2 = new SpCom ("COM2", 9600,Parity.
19、None, 8, StopBits.One);4) 發送數據 SpCom.Write(TextSendData.Text);5) 添加接收事件a) 在運行時將事件與事件處理程序相關聯(通過委托實現)SpCom.DataReceived += new SerialDataReceivedEventHandler(SpCom2
20、_DataReceived);說明:SerialDataReceivedEventHandler 委托 表示將處理 SerialPort 對象的 DataReceived 事件的方法b) 添加事件處理程序(簽名一定要一致) private void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e)6) 讀取數據 string data =
21、 SpCom .ReadExisting();3委托方法的使用 VB:1) 聲明委托 Delegate Sub myMethodDelegate(ByVal text As String) 任何具有匹配參數類型和返回類型的過程均可用來創建此委托類的實例。然后就可以通 過委托實例來調用過程。2) 定義一個委托實例 Dim myD1 As New myMethodDelegate(AddressOf myShowStringMeth
22、od)3) 定義一個實例方法 Sub myShowStringMethod(ByVal myString As String)4) 調用 'myD1(strData) Invoke(myD1, strData) Invoke 提供對某一對象公開的屬性和方法的訪問。C:1) 聲明委托 delegate void HandleInterfac
23、eUpdateDelegate(string text); 表示委托,委托是一種數據結構,它引用靜態方法或引用類實例及該類的實例方法。2) 定義一個委托實例并實例化委托對象 HandleInterfaceUpdateDelegate interfaceUpdateHandle; interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateReceiveTextBox);3)
24、 定義一個實例方法 private void UpdateReceiveTextBox(string text)4) 調用 Invoke(interfaceUpdateHandle, data); Invoke 提供對某一對象公開的屬性和方法的訪問。 4ClassLibrary的使用 VB:1) 建立一個ClassLibrary項目。在“文件”菜單上,選擇“新建項目”,在“新建項目”對話框的“模板”窗格中,單擊“類庫”。類庫名為
25、Persons,類名改為Player。2) 添加屬性。a) 方法一Public Alive As Booleanb) 方法二Private nameValue As StringPublic Property Name() As String Get Name = nameValue End Get Set(ByVal value A
26、s String) nameValue = valueEnd SetEnd Property3) 添加方法。Public Function FullName() As String End Function4) 添加事件。a) 聲明 Event AnEvent(ByVal EventNumber As Integer)b)
27、 觸發事件 RaiseEvent AnEvent(5) 5) 類庫的使用。a) 聲明類庫對象。Dim Player1 As New Persons.Playerb) 屬性使用。Player1.Alive = truePlayer1.Name = "Andr
28、ew"c) 方法使用。Dim strT As StringstrT = player1.FullNamed) 事件使用。AddHandler Player1.AnEvent, AddressOf person1_AnEvent Private Sub Player1_AnEvent(ByVal p As Integer) MsgBox(Player1.Name & " is alive")E
29、nd SubC#:1) 建立一個ClassLibrary項目。在“文件”菜單上,選擇“新建項目”,在“新建項目”對話框的“模板”窗格中,單擊“類庫”。類庫名為ClassLibraryPersons,類名改為ClassPerson。2) 添加屬性。c) 方法一Public bool Alive; d)
30、 方法二private double seconds;public double Hours get return seconds / 3600; set seconds = value * 3600; 3) 添加方法。public void ShowYear(object sender, EventArgs e) seconds = 5; 4) 添加事件。a)
31、0; 定義委托(與ClassPerson平級) public delegate void SampleEventDelegate(object sender, EventArgs e);b) 聲明 public event SampleEventDelegate SampleEvent;c) 觸發事件 SampleEvent(this, e); 5)
32、; 類庫的使用。a) 聲明類庫對象。 private ClassLibraryPersons.ClassPerson clPersons=new ClassLibraryPersons.ClassPerson() ;b) 屬性使用。 clPersons.Alive = true clPersons.Hours = 3;c)
33、 方法使用。 clPersons.ShowYear(sender ,e);d) 事件使用。 clPersons.SampleEvent += new ClassLibraryPersons.SampleEventDelegate (clPersons_SampleEvent); private void clPersons_SampleEvent(object sender, EventArgs e) 5WindowsControlLibrary的使用 VB:1)
34、 建立一個WindowsClassLibrary項目。在“文件”菜單上,選擇“新建項目”,在“新建項目”對話框的“模板”窗格中,單擊“Windows 控件庫”。控件庫名為NamesControl,類名改為NamesUserControl。2) 添加屬性。a) 方法一Public Alive As Booleanb)
35、0; 方法二Private nameValue As StringPublic Property Name() As String Get Name = nameValue End Get Set(ByVal value As String) nameValue = valueEnd SetEnd Property3) 添加方法。(Public Function FullName() As String End Function4)
36、0; 添加事件。a) 聲明 Event AnEvent(ByVal EventNumber As Integer)b) 觸發事件 RaiseEvent AnEvent(5)5) 控件的使用。a) 添加控件
37、。 工具箱(鼠標右鍵)>選擇項>.NetFrameWork組件>瀏覽>選擇要添加的控件>確定>在工具箱上選擇控件>添加到窗體上b) 屬性使用。 Player1.Alive = true Player1.Name = "Andrew"c) 方法使用。 Dim strT As String strT = player1.FullNamed)
38、0; 事件使用(屬性中選擇事件直接添加事件)。Private Sub NamesUserControl1_AnEvent(ByVal EventNumber As System.Int32) Handles NamesUserControl1.AnEventEnd SubC#:1) 建立一個WindowsClassLibrary項目。在“文件”菜單上,選擇“新建項目”,在“新建項目”對話框的“模板”窗格中,單擊“Windows 控件庫”。控件庫名為WindowsControl
39、LibraryPersons,類名改為UserControl1。2) 添加屬性。Public bool Alive; (無效)private double seconds;public double Hours get return seconds / 3600; set seconds = value * 3600; 3) 添加方法。public void ShowYear(object sender, EventArgs e) seconds = 5; 4)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論