




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、VB.NET開發(fā)全功能串口調(diào)試助手(含完整工程)小記:VB.NET的串口通信用了很長時間了,也只用 Write和Read這樣的方 法,以前都是用這種方式做上位機(jī)軟件,如此足矣。而前幾天研究GSM模塊時對Serial Port串口返回的數(shù)據(jù)總是把握不好,參考開發(fā)板附送的例程,發(fā)現(xiàn)采用 的DataReceived事件,可以實現(xiàn)中斷觸發(fā)式的數(shù)據(jù)接收。于是想到要自己做一 個串口調(diào)試助手,在實現(xiàn)基本功能的前提下增加一些方便自己調(diào)試的功能。經(jīng)過斷斷續(xù)續(xù)的編寫,就做成了下面這個小軟件:y;n03«劇£fetesft驗 止Q J審口 BBJT期&削口期這個軟件能夠?qū)崿F(xiàn)串口調(diào)試助手的
2、全部功能,經(jīng)過通信測試,數(shù)據(jù)接收性能 不亞于呼嘯工作室的SComAssistant2.2,通過加大輸入緩沖區(qū),可以滿足大量 數(shù)據(jù)接收。VB.NET的串口通信主要使用 VS自帶的SeriaIPort控件,而不是早先的 MSComm更具有兼容性,這也是很久以前就放棄 VB改用.NET的直接原因。該控 件的主要方法、屬性如下(該數(shù)據(jù)來自 VS的MSD幫助庫):方法說明Open打開一個新的串行端口連接。Close關(guān)閉端口連接,將IsOpen屬性設(shè)置為 false ,并釋放內(nèi)部 Stream對象。Read1已重載。從 Seria IPort輸入緩沖區(qū)中讀取。ReadByte從Serial Port輸入緩
3、沖區(qū)中同步讀取一個字節(jié)。ReadChar從Serial Port輸入緩沖區(qū)中同步讀取一個字符。ReadExist ing在編碼的基礎(chǔ)上,讀取Serial Port對象的流和輸入緩沖區(qū)中所有立即可用的字節(jié)。ReadL ine一直讀取到輸入緩沖區(qū)中的NewLine值。ReadTo一直讀取到輸入緩沖區(qū)中的指定value 的字符串。Write已重載。將數(shù)據(jù)寫入串行端口輸出緩沖區(qū)。WriteL ine將指定的字符串和NewLine值寫入輸出緩沖區(qū)。Discard In Buffer丿丟棄來自串行驅(qū)動程序的接收緩沖區(qū)的數(shù)據(jù)。JDiscardOutBuffer丟棄來自串行驅(qū)動程序的傳輸緩沖區(qū)的數(shù)據(jù)。GetP
4、 ortNames獲取當(dāng)前計算機(jī)的串行端口名稱數(shù)組。屬性說明P ortName獲取或設(shè)置通信端口,包括但不限于所有可用 的 COM端口。BaudRate獲取或設(shè)置串行波特率。DataBits獲取或設(shè)置每個字節(jié)的標(biāo)準(zhǔn)數(shù)據(jù)位長度。P arity獲取或設(shè)置奇偶校驗檢查協(xié)議。Sto pBits丿獲取或設(shè)置每個字節(jié)的標(biāo)準(zhǔn)停止位數(shù)。JIsOpen獲取一個值,該值指示Seria IPort對象的打開或關(guān)閉狀態(tài)。BytesToRead獲取接收緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。BytesToWrite丿獲取發(fā)送緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。JEn codi ng獲取或設(shè)置傳輸刖后文本轉(zhuǎn)換的字節(jié)編碼。ReadBufferSize獲取
5、或設(shè)置Seria IP ort輸入緩沖區(qū)的大小。ReceivedBytesThreshold獲取或設(shè)置 DataReceived 事件發(fā)生前內(nèi)部輸入 緩沖區(qū)中的字節(jié)數(shù)。想要通過串口收發(fā)數(shù)據(jù),就需要對串口進(jìn)行配置,包括設(shè)置端口、波特率、 數(shù)據(jù)格式(如 COM端口、9600bps、8位數(shù)據(jù)位、無校驗位、1位停止位)等屬 性,之后通過Open方法打開串口。打開串口可通過手動指定,也可以使用 Get Po rtNames方法獲取計算機(jī)中存在的串口。如果打開出錯,則可能是串口不 存在或者已被占用。下面是相應(yīng)代碼:Private SubSerialPortOpen()On Error GoToErrIf
6、SerialPort.lsOpen = True ThenSerialPort.Close() '避免重復(fù)打開端口Serial Port.O pen()LabelCOMStatus.Text ="串口 已打開"Exit SubErr:MsgBoxC 串口不存在或已被占用!" + vbNewLine + ErrorToString()出現(xiàn)錯誤,顯示錯誤信息En dSub如果想要在串口中支持中文字符收發(fā),則可在初始化時設(shè)置串口控件的編碼:Seria IP ort.E ncodi ng = System.Text.E ncodi ng.Default發(fā)送數(shù)據(jù)通過
7、Write方法來完成,由于串口調(diào)試助手需要支持文本和16進(jìn)制, 需要加入轉(zhuǎn)換代碼:Private SubButtonSendData_Click( ByVal sender As System.Object, ByVal eAsSystem.EventArgs) Handles ButtonSendData.ClickOn Error GoToErrDimoutDataBuf AsString = TextBoxSend.TextIf outDataBuf = "" ThenExit Sub'如果輸入文本框中沒有數(shù)據(jù)則不發(fā)送If SeriaIPort.lsOpen
8、=True Then'判斷串口是否打開If HexSendFlag = True Then十六進(jìn)制發(fā)送outDataBuf = outDataBuf.Replace( "","")'清除空格與回車outDataBuf = outDataBuf.Replace(vbNewLine, "")'十六進(jìn)制數(shù)據(jù)位數(shù)為偶數(shù),例如:FF 00 15 AC 0DIf outDataBuf.Length Mod2 <> 0 ThenMsgBoxC請輸入正確的十六進(jìn)制數(shù),用空格和回車隔開。")Exit Sub
9、En dIfDimoutBytes(outDataBuf.Le ngth / 2 - 1)As ByteFor I As Integer = 1 TooutDataBuf.Length - 1 Step 2outBytes(I - 1) / 2) = Val("&H" + Mid(outDataBuf, I, 2)的十六進(jìn)制表示方法,例如 0x1D表示為& H1D'VBNextSerial Port.Write(outBytes, 0, outDataBuf.Le ngth / 2)BarCou ntTx.Text = Val(BarCou ntTx
10、.Text) + outDataBuf.Le ngth / 2Else文本發(fā)送Serial Port.Write(outDataBuf)BarCou ntTx.Text = Val(BarCou ntTx.Text) + outDataBuf.Le ngth送字節(jié)計數(shù)EndifElseMsgBox"串口未打開,請先打開串口。")En difExit SubErr:MsgBoxC 數(shù)據(jù)輸入或發(fā)送錯誤! " + vbNewLi ne + ErrorToStri ng()En dSub接收數(shù)據(jù)采用DataReceived事件,該事件在串口輸入緩沖區(qū)中的字節(jié)數(shù)滿足設(shè)置條件
11、時觸發(fā),并執(zhí)行事件中的代碼。事件觸發(fā)的字節(jié)數(shù)在ReceivedBytesThreshold 屬性中設(shè)置,默認(rèn)為1字節(jié)。由于DataReceived事件 采用了獨立的線程,無法對軟件界面中的控件進(jìn)行直接操作, 因而在現(xiàn)實時需要 采用委托實例的方法。首先建立委托:Delegate SubRecieveRefreshMethodDelegate( ByVal text AsString )'聲明委托Dim RecieveRefresh AsNewRecieveRefreshMethodDelegate( AddressOf Recie veRefreshMethod)'定義數(shù)據(jù)顯示委
12、托實例Sub RecieveRefreshMethod( ByVal str As String )'定義一個數(shù)據(jù)顯示委托實 例的方法ShowRecieveData(str)EndSub其中ShowRecieveData函數(shù)將str字符串顯示到TextBox控件中。下面是DataReceived事件中對十六進(jìn)制數(shù)據(jù)的處理。同發(fā)送數(shù)據(jù)一樣,讀取 數(shù)據(jù)時也要根據(jù)不同的顯示方式使用不同的方法。VB.NET通過Read方法,根據(jù)緩沖區(qū)中存在的字節(jié)數(shù)讀取十六進(jìn)制數(shù)據(jù),而文本顯示則簡單的多,只需 ReadExisting即可。最后通過Invoke方法調(diào)用委托,顯示數(shù)據(jù)。Private Sub Se
13、rialPort_DataReceived( ByVal sender As Object, ByVal e AsSystem. lO.P orts.SerialDataReceivedEve ntArgs)Han dles Seria IP ort.DataReceivedIf HexRecieveFlag Then十六進(jìn)制顯示Dim inDataLen As Integer = SeriaIPort.BytesToRead()'獲取可讀取的字節(jié)數(shù)If inDataLen > 0 ThenDim inBytes(inDataLen - 1) As Byte, bytes As
14、ByteDim strHex As String =""Serial Port.Read(i nBytes, 0, i nDataLe n)'讀取數(shù)據(jù)For Each bytes In in BytesstrHex = strHex + String.Format( "0:X2 ", bytes)'格式化成十六進(jìn)制(不含&H)NextTextBoxRecieve.I nvoke(RecieveRefresh, strHex)'調(diào)用委托,顯示接收的數(shù)據(jù)BarCou ntRx.Text = (Val(BarCou ntRx.Text) + in DataLe n).ToStri ng接收字節(jié)計數(shù)End IfElse文本顯示Dim str As Stringstr = Seria IP ort.ReadExisti ng'讀取全部可用字符串TextBoxRecieve .Inv oke(RecieveRefresh, str)'
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東梅州職業(yè)技術(shù)學(xué)院《交通規(guī)劃課程設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 哈爾濱商業(yè)大學(xué)《物理化學(xué)實驗(上)》2023-2024學(xué)年第二學(xué)期期末試卷
- 黑龍江藝術(shù)職業(yè)學(xué)院《地理專業(yè)》2023-2024學(xué)年第二學(xué)期期末試卷
- 14保護(hù)呼吸器官(教學(xué)設(shè)計)-2024-2025學(xué)年科學(xué)三年級上冊人教鄂教版
- 河南輕工職業(yè)學(xué)院《嵌入式綜合實訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 中南林業(yè)科技大學(xué)《生命科學(xué)進(jìn)展》2023-2024學(xué)年第二學(xué)期期末試卷
- 宜賓學(xué)院《天然產(chǎn)物》2023-2024學(xué)年第二學(xué)期期末試卷
- 哈爾濱商業(yè)大學(xué)《流體力學(xué)B》2023-2024學(xué)年第二學(xué)期期末試卷
- 瀘州四川瀘州瀘縣氣象局見習(xí)基地招收見習(xí)人員2人筆試歷年參考題庫附帶答案詳解
- 大連軟件職業(yè)學(xué)院《數(shù)據(jù)結(jié)構(gòu)實驗》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年湖南中醫(yī)藥高等??茖W(xué)校高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 研學(xué)旅行概論教學(xué)課件匯總完整版電子教案
- 12月腹痛護(hù)理常規(guī)
- 控股集團(tuán)公司組織架構(gòu)圖.docx
- 高爐煤氣安全知識的培訓(xùn)
- 2008 年全國高校俄語專業(yè)四級水平測試試卷
- 需求供給與均衡價格PPT課件
- 最常用2000個英語單詞_(全部標(biāo)有注釋)字母排序
- 在銀行大零售業(yè)務(wù)工作會議上的講話講解學(xué)習(xí)
- 古代傳說中的藝術(shù)形象-
- 水電站大壩土建安裝工程懸臂模板施工手冊
評論
0/150
提交評論