




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、使用SerialPort類設(shè)計串口通訊程一.概述輸送帶控制模塊的核心技術(shù)是與PLC的串口通訊,在Visual Studio 6.0中編寫串口通訊程序,一般都使用Microsoft Communication Control(簡稱MSComm的通訊控件,只要通過對此控件的屬性和事件進行相應編程操作,就可以輕松地實現(xiàn)串口通訊。但在Microsoft.Net技術(shù)廣泛應用的今天,Visual Studio.Net沒有將此控件加入控件庫,所以人們采用了許多方法在Visual Studio.Net來編寫串口通訊程序:第一種方法是通過采用Visual Studio 6.0中原來的MSComm控件這是最簡單的
2、,最方便的方法,但需要注冊;第二種方法是采用微軟在.NET推出了一個串口控件,基于.NET的P/Invoke調(diào)用方法實現(xiàn);第三種方法是自己用API寫串口通信,雖然難度高,但可以方便實現(xiàn)自己想要的各種功能?,F(xiàn)在微軟推出了最新版本的Visual Studio 2005開發(fā)工具,可以不再采用第三方控件的方法來設(shè)計串口通訊程序。NET Framework 2.0類庫包含了SerialPort類,方便地實現(xiàn)了所需要串口通訊的多種功能,為了使MSComm編程方法快速轉(zhuǎn)換到以SerialPort類為核心的串口通訊的設(shè)計方法,這里著重討論了Visual Studio 6.0的MSComm控件和SerialPo
3、rt類設(shè)計方法的異同點。二.SerialPort常用屬性、方法和事件1.命名空間2.串口的通訊參數(shù)串口通訊最常用的參數(shù)就是通訊端口號及通訊格式(波特率、數(shù)據(jù)位、停止位和校驗位,在MSComm 中相關(guān)的屬性是CommPort和Settings。SerialPort類與MSComm有一些區(qū)別:通訊端口號PortName屬性獲取或設(shè)置通信端口,包括但不限于所有可用的COM 端口,請注意該屬性返回類型為String,不是Mscomm.CommPort的short類型。通常情況下,PortName正常返回的值為COM1、COM2,SerialPort類最大支持的端口數(shù)突破了CommPort控件中Comm
4、Port 屬性不能超過16的限止,大大方便了用戶串口設(shè)備的配置。通訊格式SerialPort類對分別用BaudRate、Parity 、DataBits、StopBits屬性設(shè)置通訊格式中的波特率、校驗位、數(shù)據(jù)位和停止位,其中Parity和StopBits分別是枚舉類型Parity、StopBits,Parity 類型中枚舉了Odd(奇、Even(偶、Mark、None、Space,Parity枚舉了None、One、OnePointFive、Two。SerialPort類提供了七個重載的構(gòu)造函數(shù),既可以對已經(jīng)實例化的SerialPort對象設(shè)置上述相關(guān)屬性的值,也可以使用指定的端口名稱、波特
5、率和奇偶校驗位數(shù)據(jù)位和停止位直接初始化SerialPort 類的新實例。3.串口的打開和關(guān)閉SerialPort類沒有采用MSComm.PortOpen=True/False設(shè)置屬性值打開關(guān)閉串口,相應的是調(diào)用類的Open(和Close(方法。4.數(shù)據(jù)的發(fā)送和讀取SerialPort類調(diào)用重載的Write和WriteLine方法發(fā)送數(shù)據(jù),其中WriteLine可發(fā)送字符串并在字符串末尾加入換行符,讀取串口緩沖區(qū)的方法有許多,其中除了ReadExisting(讀取SerialPort對象的流和輸入緩沖區(qū)中所有立即可用的字節(jié)和ReadTo(一直讀取到輸入緩沖區(qū)中的指定value 的字符串,其余的方
6、法都是同步調(diào)用,線程被阻塞直到緩沖區(qū)有相應的數(shù)據(jù)或大于ReadTimeOut屬性設(shè)定的時間值后,引發(fā)ReadExisting異常。5. DataReceived事件該事件類似于MSComm控件中的OnComm事件,DataReceived事件在接收到了ReceivedBytesThreshold設(shè)置的字符個數(shù)或接收到了文件結(jié)束字符并將其放入了輸入緩沖區(qū)時被觸發(fā)。其中ReceivedBytesThreshold相當于MSComm控件的Rthreshold屬性,該事件的用法與MsComm控件的OnComm事件在CommEvent為comEvSend和comEvEof時是一致的。三.SerialPo
7、rt的使用對于熟悉MSComm控件的程序設(shè)計者,SerialPort類是相當容易上手的。在進行串口通訊時,一般的流程是設(shè)置通訊端口號及波特率、數(shù)據(jù)位、停止位和校驗位,再打開端口連接,發(fā)送數(shù)據(jù),接收數(shù)據(jù),最后關(guān)閉端口連接這樣幾個步驟。SerialPort類讀取數(shù)據(jù)的許多方法是同步阻塞調(diào)用,盡量避免在主線程中調(diào)用,可以使用異步處理或線程間處理調(diào)用這些讀取數(shù)據(jù)的方法。由于DataReceived事件在輔線程被引發(fā),當收到完整的一條數(shù)據(jù),返回主線程處理或在窗體上顯示時,請注意跨線程的處理,C#可采用控件異步委托的方法Control.BeginInvoke及同步委托的方法Invoke。1.以添加控件的方
8、式(有用戶界面VB:1從工具箱選擇SerialPort控件添加到窗體上,命名為SpCom。2設(shè)置通訊端口號及波特率、數(shù)據(jù)位、停止位和校驗位。SpCom.PortName = "COM1"SpCom.BaudRate = 9600SpCom.DataBits = 83發(fā)送數(shù)據(jù)SpCom.Write(TextSendData.Text4添加接受事件Private Sub SpCom_DataReceived(ByVal sender As Object, ByVal e As5讀取數(shù)據(jù)Dim strT As StringstrT =SpCom.ReadExisting(C#:1
9、從工具箱選擇SerialPort控件添加到窗體上,命名為SpCom。2設(shè)置通訊端口號及波特率、數(shù)據(jù)位、停止位和校驗位。SpCom.PortName = "COM1"SpCom.BaudRate = 9600;SpCom.DataBits = 8;3發(fā)送數(shù)據(jù)SpCom.Write(TextSendData.Text ;4添加接受事件private void serialPortCom2_DataReceived(object sender,5讀取數(shù)據(jù)String strT;strT=SpCom.ReadExisting(;2.以類的方式VB:1定義SerialPort類實例2
10、設(shè)置通訊端口號及波特率、數(shù)據(jù)位、停止位和校驗位。SpCom.PortName = "COM1"SpCom.BaudRate = 9600SpCom.DataBits = 8或是定義時直接初始化3發(fā)送數(shù)據(jù)SpCom.Write(TextSendData.Text4添加接受事件a在運行時將事件與事件處理程序相關(guān)聯(lián)AddHandler SpCom.DataReceived, AddressOf EventReceiveData說明:AddressOf創(chuàng)建引用特定過程的過程委托實例AddressOf運算符可以用作委托構(gòu)造函數(shù)的操作數(shù),或可以用在編譯器能夠確定委托類型的上下文中。b添
11、加事件處理程序(簽名一定要一致Sub EventReceiveData(ByVal sender As Object, ByVal e As5讀取數(shù)據(jù)Dim strT As StringstrT =SpCom.ReadExisting(C#:1添加引用2定義SerialPort類實例private SerialPort SpCom2 = new SpCom("COM2", 9600,Parity.None, 8, StopBits.One;3設(shè)置通訊端口號及波特率、數(shù)據(jù)位、停止位和校驗位。SpCom.PortName = "COM1"SpCom.Baud
12、Rate = 9600;SpCom.DataBits = 8;或是定義時直接初始化private SerialPort SpCom2 = new SpCom("COM2", 9600,Parity.None, 8, StopBits.One;4發(fā)送數(shù)據(jù)SpCom.Write(TextSendData.Text;5添加接收事件a在運行時將事件與事件處理程序相關(guān)聯(lián)(通過委托實現(xiàn)SpCom.DataReceived += new SerialDataReceivedEventHandler(SpCom2_DataReceived;說明:SerialDataReceivedEven
13、tHandler委托表示將處理SerialPort對象的DataReceived事件的方法b添加事件處理程序(簽名一定要一致private void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e6讀取數(shù)據(jù)string data =SpCom.ReadExisting(;3.委托方法的使用VB:1聲明委托Delegate Sub myMethodDelegate(ByVal text As String任何具有匹配參數(shù)類型和返回類型的過程均可用來創(chuàng)建此委托類的實例。然后就可以通過委托實例來調(diào)用過程。2定義一個委托實
14、例Dim myD1 As New myMethodDelegate(AddressOf myShowStringMethod3定義一個實例方法Sub myShowStringMethod(ByVal myString As String4調(diào)用'myD1(strDataInvoke(myD1, strDataInvoke提供對某一對象公開的屬性和方法的訪問。C#:1聲明委托delegate void HandleInterfaceUpdateDelegate(string text;表示委托,委托是一種數(shù)據(jù)結(jié)構(gòu),它引用靜態(tài)方法或引用類實例及該類的實例方法。2定義一個委托實例并實例化委托對
15、象HandleInterfaceUpdateDelegate interfaceUpdateHandle;interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateReceiveTextBox;3定義一個實例方法private void UpdateReceiveTextBox(string text4調(diào)用Invoke(interfaceUpdateHandle, data;Invoke提供對某一對象公開的屬性和方法的訪問。4.ClassLibrary的使用VB:1建立一個ClassLibrary項目。在“文件”菜單上,選擇
16、“新建項目”,在“新建項目”對話框的“模板”窗格中,單擊“類庫”。類庫名為Persons,類名改為Player。2添加屬性。a方法一Public Alive As Booleanb方法二Private nameValue As StringPublic Property Name( As StringGetName = nameValueEnd GetSet(ByVal value As StringnameValue = valueEnd SetEnd Property3添加方法。Public Function FullName( As String End Function 4 添加事件。
17、 a b 聲明 觸發(fā)事件 Event AnEvent(ByVal EventNumber As Integer RaiseEvent AnEvent(5 5 類庫的使用。 a b 聲明類庫對象。 屬性使用。 Dim Player1 As New Persons.Player Player1.Alive = true Player1.Name = "Andrew" c 方法使用。 Dim strT As String strT = player1.FullName d 事件使用。 AddHandler Player1.AnEvent, AddressOf person1_An
18、Event Private Sub Player1_AnEvent(ByVal p As Integer MsgBox(Player1.Name & " is alive" End Sub C#: 1 建立一個 ClassLibrary 項目。在“文件”菜單上,選擇“新建項目”,在“新建項目” 對話框的“模板”窗格中,單擊“類庫”。類庫名為 ClassLibraryPersons,類名改為 ClassPerson。 2 添加屬性。 c d 方法一 方法二 Public bool Alive; private double seconds; public double
19、 Hours get return seconds / 3600; set seconds = value * 3600; 添加方法。 public void ShowYear(object sender, EventArgs e seconds = 5; 3 4 添加事件。 a 定義委托(與 ClassPerson 平級) public delegate void SampleEventDelegate(object sender, EventArgs e; b c 聲明 public event SampleEventDelegate SampleEvent; 觸發(fā)事件 SampleEve
20、nt(this, e; 5 類庫的使用。 a 聲明類庫對象。 private ClassLibraryPersons.ClassPerson clPersons=new ClassLibraryPersons.ClassPerson( ; b 屬性使用。 clPersons.Alive = true clPersons.Hours = 3; c d 方法使用。 clPersons.ShowYear(sender ,e; 事件使用。 clPersons.SampleEvent += new ClassLibraryPersons.SampleEventDelegate (clPersons_Sa
21、mpleEvent; private void clPersons_SampleEvent(object sender, EventArgs e 5WindowsControlLibrary 的使用 VB: 1 建立一個 WindowsClassLibrary 項目。在“文件”菜單上,選擇“新建項目”,在“新建 項目”對話框的“模板”窗格中,單擊“Windows 控件庫”??丶烀麨?NamesControl, 類名改為 NamesUserControl。 2 添加屬性。 a b 方法一 方法二 Public Alive As Boolean Private nameValue As Stri
22、ng Public Property Name( As String Get Name = nameValue End Get Set(ByVal value As String nameValue = value End Set End Property 添加方法。( Public End Function Function FullName( As String 3 4 添加事件。 a b 聲明 Event AnEvent(ByVal EventNumber As Integer 觸發(fā)事件 RaiseEvent AnEvent(5 5 控件的使用。 a 添加控件。 工具箱(鼠標右鍵>
23、選擇項>.NetFrameWork 組件>瀏覽>選擇要添加的控件>確定 >在工具箱上選擇控件>添加到窗體上 b 屬性使用。 Player1.Alive = true Player1.Name = "Andrew" c 方法使用。 Dim strT As String strT = player1.FullName d 事件使用(屬性中選擇事件直接添加事件)。 Private Sub NamesUserControl1_AnEvent(ByVal EventNumber As System.Int32 Handles NamesUserCo
24、ntrol1.AnEvent End Sub C#: 1 建立一個 WindowsClassLibrary 項目。在“文件”菜單上,選擇“新建項目”,在“新建 項目”對話框的“模板”窗格中,單擊“Windows 控件庫”??丶烀麨?WindowsControlLibraryPersons,類名改為 UserControl1。 2 添加屬性。 Public bool Alive; (無效) private double seconds; public double Hours get return seconds / 3600; set seconds = value * 3600; 添加方法。 public void ShowYear(object sender, Eve
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水產(chǎn)養(yǎng)殖信息化管理平臺-洞察闡釋
- 清潔能源革命與經(jīng)濟波動的應對策略-洞察闡釋
- 歌劇藝術(shù)傳承與創(chuàng)新-洞察闡釋
- 基于大數(shù)據(jù)的智能城市物聯(lián)網(wǎng)應用-洞察闡釋
- 氣候變化背景下的國際商務(wù)談判-洞察闡釋
- 水果種植資源高效利用-洞察闡釋
- 基于機器學習的網(wǎng)絡(luò)動態(tài)流量特征識別與性能優(yōu)化-洞察闡釋
- 財務(wù)危機預警系統(tǒng)構(gòu)建與應用考核試卷
- 紡織品的功能性與智能化發(fā)展考核試卷
- 綠色防水材料發(fā)展趨勢考核試卷
- 《醫(yī)療整形美容麻醉安全規(guī)范》
- 危險化學品常識一書一簽考核試卷
- 立體幾何中球與幾何體的切接問題-高考數(shù)學復習重點題型歸納與方法總結(jié)(原卷版)
- DB35T 88-2022 伐區(qū)調(diào)查設(shè)計技術(shù)規(guī)程
- 蝸牛與黃鸝鳥(課件)人音版音樂二年級上冊
- 經(jīng)濟師考試旅游經(jīng)濟(中級)專業(yè)知識和實務(wù)試卷及解答參考
- 班級規(guī)章 創(chuàng)造和諧
- 2024全國高中數(shù)學聯(lián)賽山東賽區(qū)預賽試卷(含解析)
- 2024年中國家具電商行業(yè)市場競爭格局及投資方向研究報告(智研咨詢)
- 導數(shù)(30題)-2024年考前15天高考數(shù)學沖刺大題訓練(新高考)含答案
- 高層建筑一棟一冊消防安全檔案
評論
0/150
提交評論