![2[1].2_串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/13/95637c6a-b5ff-427a-9957-0f71d76b48b1/95637c6a-b5ff-427a-9957-0f71d76b48b11.gif)
![2[1].2_串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/13/95637c6a-b5ff-427a-9957-0f71d76b48b1/95637c6a-b5ff-427a-9957-0f71d76b48b12.gif)
![2[1].2_串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/13/95637c6a-b5ff-427a-9957-0f71d76b48b1/95637c6a-b5ff-427a-9957-0f71d76b48b13.gif)
![2[1].2_串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/13/95637c6a-b5ff-427a-9957-0f71d76b48b1/95637c6a-b5ff-427a-9957-0f71d76b48b14.gif)
![2[1].2_串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/13/95637c6a-b5ff-427a-9957-0f71d76b48b1/95637c6a-b5ff-427a-9957-0f71d76b48b15.gif)
免費(fèi)預(yù)覽已結(jié)束,剩余32頁(yè)可下載查看
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
工控程序設(shè)計(jì) 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 2 2 1學(xué)習(xí)要點(diǎn)1 知識(shí)點(diǎn) SerialPort類實(shí)例的構(gòu)造 接收串口數(shù)據(jù)的方法 接收超時(shí)異常處理 HSDZC電能綜合測(cè)試儀的數(shù)據(jù)格式 數(shù)據(jù)幀片段的緩存方法2 技能點(diǎn) 應(yīng)用程序項(xiàng)目和SerialPort對(duì)象的創(chuàng)建 串口數(shù)據(jù)接收 接收數(shù)據(jù)的緩存和數(shù)據(jù)幀的提取2 2 2任務(wù)描述某些串口設(shè)備能夠定時(shí) 主動(dòng)地向上位機(jī)發(fā)送數(shù)據(jù) 處于上位機(jī)端的工業(yè)控制程序 需要獲取串口收到的數(shù)據(jù)并進(jìn)行分析和處理 利用 NETFramework2 0及更高版本提供的SerialPort類可以比較方便地在C 應(yīng)用程序中實(shí)現(xiàn)串口通信功能 從編程的角度看 串口數(shù)據(jù)的接收就是利用SerialPort對(duì)象的Read或ReadByte方法將操作系統(tǒng)存放在串口輸入緩沖區(qū)中的數(shù)據(jù)讀入到一個(gè)字節(jié)數(shù)組中 該教學(xué)情景通過(guò)串口數(shù)據(jù)接收 接收數(shù)據(jù)的緩存 數(shù)據(jù)幀的提取 浮點(diǎn)數(shù)解碼這幾個(gè)實(shí)施步驟 達(dá)到使用SerialPort對(duì)象接收單個(gè)串口設(shè)備 下位機(jī) 數(shù)據(jù)的目的 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 2 2 3相關(guān)知識(shí)1SerialPort類實(shí)例的構(gòu)造SerialPort類是從 NETFramework2 0版本開(kāi)始提供的一個(gè)串口控制類 該類包含在System IO Ports命名空間中 使用該類的實(shí)例可以打開(kāi)串口 并發(fā)送數(shù)據(jù) 通過(guò)構(gòu)造函數(shù)可以產(chǎn)生SerialPort類的實(shí)例 SerialPort類的構(gòu)造函數(shù)在定義時(shí)進(jìn)行了重載 表2 2 1中列出了這些重載構(gòu)造函數(shù)的接口定義 表2 2 1SerialPort類的構(gòu)造函數(shù)定義 表2 2 1SerialPort類的構(gòu)造函數(shù)定義 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 除了在構(gòu)造SerialPort類實(shí)例的時(shí)候可以對(duì)端口名稱 波特率 奇偶校驗(yàn)位 數(shù)據(jù)位和停止位進(jìn)行設(shè)置外 構(gòu)造好SerialPort類實(shí)例后 還可以通過(guò)PortName BaudRate Parity DataBits StopBits屬性對(duì)這些參數(shù)進(jìn)行修改 因此構(gòu)造SerialPort類實(shí)例的程序書(shū)寫形式比較靈活 2串口的打開(kāi)和關(guān)閉SerialPort類中與串口打開(kāi)和關(guān)閉相關(guān)的成員如下 1 Open方法Open方法打開(kāi)新的串口連接 該方法不帶參數(shù) 接口定義如下 publicvoidOpen 2 Close方法Close方法關(guān)閉已經(jīng)打開(kāi)的串口連接 該方法不帶參數(shù) 接口定義如下 publicvoidClose 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 3 IsOpen屬性通過(guò)IsOpen屬性可以獲知串口當(dāng)前是否為打開(kāi)狀態(tài) 返回一個(gè)bool類型的值 該屬性只讀 接口定義如下 publicboolIsOpen get 串口不能重復(fù)進(jìn)行打開(kāi)和關(guān)閉操作 在打開(kāi)或關(guān)閉串口前 都要使用該屬性檢查串口是否已經(jīng)處于打開(kāi)或已經(jīng)處于關(guān)閉狀態(tài) 以免引發(fā)異常 3接收串口數(shù)據(jù)的方法 1 ReadByte方法SerialPort類的ReadByte方法可以從串口接收緩沖區(qū)中讀取一個(gè)字節(jié) 該方法的接口定義是 publicintReadByte 該方法從串口接收緩沖區(qū)中讀取一個(gè)字節(jié) 要和ReadTimeout屬性配合使用 當(dāng)調(diào)用ReadByte方法時(shí) 如果接收緩沖區(qū)中沒(méi)有數(shù)據(jù) 則程序被阻塞 直到緩沖區(qū)中有數(shù)據(jù)或到達(dá)ReadTimeout屬性指定讀取數(shù)據(jù)超時(shí)的毫秒數(shù) 程序才能繼續(xù)運(yùn)行 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 ReadByte方法返回一個(gè)int類型的值 在實(shí)際應(yīng)用時(shí) 要將返回值強(qiáng)制轉(zhuǎn)換為byte類型 2 Read方法Read方法從串口接收緩沖區(qū)中讀取多個(gè)字節(jié) 該方法的接口定義是 publicintRead byte buffer intoffset intcount 該方法試圖從接收緩沖區(qū)中讀取count個(gè)字節(jié) 并寫入字節(jié)數(shù)組buffer中 寫入的起始位置是offset 執(zhí)行后返回實(shí)際讀取的字節(jié)數(shù) 例如 現(xiàn)在接收緩沖區(qū)中只有6個(gè)字節(jié) 但count參數(shù)值為10 則返回值為6 在實(shí)際應(yīng)用時(shí) 通常先通過(guò)SerialPort對(duì)象的BytesToRead屬性獲得接收緩沖區(qū)中已有的字節(jié)數(shù) 并根據(jù)該屬性值來(lái)設(shè)置count參數(shù) 和ReadByte方法不同的是 調(diào)用Read方法時(shí) 不管接收緩沖區(qū)中有無(wú)數(shù)據(jù) 都不會(huì)對(duì)應(yīng)用程序的當(dāng)前線程造成阻塞 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 4接收超時(shí)異常處理當(dāng)使用ReadByte方法從接收緩沖區(qū)中讀取一個(gè)字節(jié)時(shí) 如果下位機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù)沒(méi)有在ReadTimeout規(guī)定的時(shí)間內(nèi)到達(dá) 則會(huì)引發(fā)TimeoutException 應(yīng)用程序可以捕獲該異常 并作相應(yīng)處理 下面的測(cè)試程序說(shuō)明了超時(shí)異常處理的方法 SerialPortsp privatevoidbtnStart Click objectsender EventArgse bytefirstByte sp ReadExisting 清空接收緩沖區(qū) 準(zhǔn)備接收數(shù)據(jù)sp ReadTimeout 10000 10秒內(nèi)沒(méi)有收到回復(fù)數(shù)據(jù) 將捕獲到異常try firstByte byte sp ReadByte 同步讀取 程序在此被阻塞 t1 Text firstByte ToString X2 顯示在文本框t1中 catch TimeoutExceptionex 捕獲到接收超時(shí)異常 t1 Text ex Message 在t1中顯示異常信息 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 圖2 2 1接收超時(shí)異常測(cè)試如上圖所示 在點(diǎn)擊 開(kāi)始 按鈕后 程序被阻塞 此時(shí)窗口對(duì)鼠標(biāo)和鍵盤的輸入都不響應(yīng) 為了有足夠操作時(shí)間 SerialPort對(duì)象sp的ReadTimeout屬性為10000毫秒 10秒 在10秒時(shí)間內(nèi) 測(cè)試者可以通過(guò)串口測(cè)試程序發(fā)送一個(gè)或多個(gè)字節(jié)過(guò)來(lái) 此時(shí)程序結(jié)束阻塞狀態(tài)繼續(xù)運(yùn)行 并在文本框中顯示接收到的第1個(gè)字節(jié) 如果10秒內(nèi)沒(méi)有數(shù)據(jù)到達(dá) 則引發(fā)TimeoutException 若上位機(jī)程序要一直等待 可以把ReadTimeout屬性的值設(shè)置為 1 但在實(shí)際應(yīng)用中一般不這樣做 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 5HSDZC電能綜合測(cè)試儀的數(shù)據(jù)格式HSDZC電能綜合測(cè)試儀在鉆機(jī)性能測(cè)試系統(tǒng)中用于輸入功率 輸出功率以及功率因素 參見(jiàn)引言介紹 該設(shè)備提供兩種電腦測(cè)量方式 在儀表提示 測(cè)量方式 時(shí) 可以分別按 顯示1 和 顯示2 進(jìn)入 在測(cè)量方式1的情況下測(cè)試儀每秒通過(guò)RS 232接口發(fā)送1組數(shù)據(jù) 長(zhǎng)度46字節(jié) 信號(hào)格式 開(kāi)始4字節(jié)均為FFH 后續(xù)每三個(gè)字節(jié)構(gòu)成一個(gè)浮點(diǎn)數(shù)值 分別表示I1 U1 I2 U2 I3 U3 以及功率因數(shù) 視在功率 效率 輸入功率 無(wú)功功率 負(fù)載率 輸出功率 轉(zhuǎn)速 共14個(gè)數(shù)據(jù) 在測(cè)量方式2的情況下測(cè)試儀也是每秒通過(guò)RS 232接口發(fā)送1組數(shù)據(jù) 長(zhǎng)度30字節(jié) 信號(hào)格式 開(kāi)始3字節(jié)均為12H 34H 56H 后續(xù)每三個(gè)字節(jié)構(gòu)成一個(gè)浮點(diǎn)數(shù)值 分別表示I1 U1 P1 I2 U2 P2 I3 U3 P3 共9個(gè)數(shù)據(jù) 上位機(jī)在和HSDZC電能綜合測(cè)試儀進(jìn)行通信時(shí) 不需要向設(shè)備寫入數(shù)據(jù) 而是被動(dòng)地讀取設(shè)備發(fā)送過(guò)來(lái)的數(shù)據(jù) 下面的相關(guān)知識(shí)將進(jìn)一步介紹對(duì)已接收到數(shù)據(jù)的存儲(chǔ)和處理方法 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 構(gòu)成浮點(diǎn)數(shù)值的3個(gè)字節(jié)含義是 第1字節(jié) B1 為尾數(shù)低位 第2字節(jié) B2 為尾數(shù)高位 第3字節(jié) B3 為階碼指數(shù) 其中階碼指數(shù)各位的含義如表2 2 2所示 表2 2 2階碼指數(shù)字節(jié)中各位的含義 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 尾數(shù)B的值在0到1之間 計(jì)算公式是 下面的HexToFloat函數(shù)描述了將3個(gè)字節(jié)轉(zhuǎn)換為浮點(diǎn)數(shù)的算法 privatefloatHexToFloat byteB1 byteB2 byteB3 floatf B n B 尾數(shù)n 階碼指數(shù)B B2 256 B1 65536F if B3 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 6數(shù)據(jù)幀片段的緩存方法 1 使用集合類存儲(chǔ)接收數(shù)據(jù)在通信過(guò)程中 數(shù)據(jù)幀表示由多個(gè)字節(jié)構(gòu)成的 具有一定格式 表示完整語(yǔ)意的一組數(shù)據(jù) 例如 在和HSDZC電能綜合測(cè)試儀進(jìn)行通信時(shí) 如果測(cè)試儀工作在測(cè)量方式1 則一幀數(shù)據(jù)的長(zhǎng)度為46個(gè)字節(jié) 包含起始標(biāo)志和14個(gè)數(shù)值 在系統(tǒng)實(shí)際運(yùn)行中 下位機(jī)向上位機(jī)發(fā)送數(shù)據(jù)時(shí) 可能會(huì)將數(shù)據(jù)幀分為幾個(gè)片段依次發(fā)送 或者在一次接收到的數(shù)據(jù)中包含了不止一幀數(shù)據(jù) 上位機(jī)必須提供一個(gè)字節(jié)的集合來(lái)對(duì)接收到的數(shù)據(jù)進(jìn)行緩存 暫存 在確認(rèn)接收完畢一幀數(shù)據(jù)后 再進(jìn)行進(jìn)一步的分析和處理 NETFramework2 0以上版本提供了List類來(lái)實(shí)現(xiàn)集合元素管理 List類支持泛型 在存取byte類型的集合元素時(shí)無(wú)需進(jìn)行 裝箱 和 拆箱 操作 比使用ArrayList效率高 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 List類提供了豐富的方法來(lái)對(duì)集合中的元素進(jìn)行操作 表2 2 3列出了List類的常用方法 表中的示例建立在如下定義的基礎(chǔ)上 byteb byte ba Listli newList 創(chuàng)建List類的實(shí)例li 元素類型為byte表2 2 3List類的常用方法 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 2 集合大小的設(shè)置為了保證集合中任何時(shí)候能容納一個(gè)完整的數(shù)據(jù)幀 集合中能容納的字節(jié)數(shù)量應(yīng)為數(shù)據(jù)幀長(zhǎng)度的兩倍 集合中的數(shù)據(jù)采取隊(duì)列形式進(jìn)行處理 新來(lái)的數(shù)據(jù)從隊(duì)尾進(jìn) 如果原有數(shù)據(jù)字節(jié)數(shù)加上新接收字節(jié)數(shù)超過(guò)集合的最大容量 則將隊(duì)首的部份數(shù)據(jù)刪除 圖2 2 2展示數(shù)據(jù)入隊(duì)和出隊(duì)的過(guò)程 L 隊(duì)列總?cè)萘縉 原有字節(jié)數(shù)M 新接收字節(jié)數(shù) 1 隊(duì)列剩余空間能容納新接收數(shù)據(jù)L 隊(duì)列總?cè)萘縉 原有字節(jié)數(shù)M 新接收字節(jié)數(shù) 2 隊(duì)列剩余空間能容納新接收數(shù)據(jù)圖2 2 2新接收數(shù)據(jù)的緩存 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 2 2 4任務(wù)實(shí)施1應(yīng)用程序項(xiàng)目的創(chuàng)建串口通信應(yīng)用程序的開(kāi)發(fā)在VisualStudio集成開(kāi)發(fā)環(huán)境中進(jìn)行 首先創(chuàng)建一個(gè)基于C 語(yǔ)言的 Windows應(yīng)用程序 項(xiàng)目 名為 ReceiveData 并存放在工作目錄 F SerialPort 下 如圖2 2 3所示 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 2SerialPort對(duì)象的創(chuàng)建創(chuàng)建SerialPort對(duì)象可以通過(guò)添加控件和編寫代碼兩種方式 添加控件的方式相對(duì)簡(jiǎn)單 適合初學(xué)者練習(xí) 編寫代碼的方式具有較強(qiáng)的靈活性 可以把SerialPort對(duì)象對(duì)串口的操作細(xì)節(jié)隱藏起來(lái) 與數(shù)據(jù)編碼 解碼等功能一起封裝為一個(gè)功能完整的串口通信模塊 1 通過(guò)添加控件創(chuàng)建SerialPort對(duì)象在 工具箱 中展開(kāi) 組件 選項(xiàng)卡 選擇 SerialPort 組件 如圖2 2 4 用鼠標(biāo)拖動(dòng)到設(shè)計(jì)視圖中的窗口上 由于SerialPort是不可見(jiàn)組件 所以不直接出現(xiàn)在窗體上 而是出現(xiàn)在窗口下方 如圖2 2 5所示 該操作的實(shí)質(zhì)是在窗體設(shè)計(jì)器的源代碼 文件名Form1 Designer cs 中添加了如下代碼 privateSystem IO Ports SerialPortserialPort1 this serialPort1 newSystem IO Ports SerialPort ponents 實(shí)質(zhì)上是定義并實(shí)例化了一個(gè)名為serialPort1的SerialPort對(duì)象 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 2 編寫代碼創(chuàng)建SerialPort對(duì)象切換到代碼視圖 在Form1 cs中編寫上述代碼同樣可以創(chuàng)建SerialPort對(duì)象 首先在最前面引入System IO Ports命名空間 usingSystem IO Ports 然后定義SerialPort類的對(duì)象sp 作為Form1類的私有成員 privateSerialPortsp 最后在Form1類的構(gòu)造函數(shù)中創(chuàng)建對(duì)象 publicForm1 InitializeComponent sp newSerialPort 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 2 2 4選擇SerialPort組件 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 2 2 5將SerialPort組件加入窗體中當(dāng)然 工程實(shí)踐中 SerialPort對(duì)象不一定在窗體類中定義 如果項(xiàng)目代碼量大 可以專門建立一個(gè)負(fù)責(zé)串口通信和調(diào)度的類 在里面定義一個(gè)或多個(gè)SerialPort對(duì)象作為該類的成員 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 3串口數(shù)據(jù)的接收在下面的程序中 當(dāng)點(diǎn)擊 開(kāi)始接收 按鈕時(shí) 程序調(diào)用SerialPort對(duì)象的ReadByte方法 阻塞當(dāng)前線程 并開(kāi)始接收下位機(jī)發(fā)送的數(shù)據(jù) 如果在10秒內(nèi)接收到數(shù)據(jù) 則將接收到的數(shù)據(jù)以十六進(jìn)制方式顯示在文本框中 否則在文本框中顯示 操作超時(shí) 異常提示 在編寫程序之前 先在系統(tǒng)中安裝虛擬串口對(duì)COM1和COM2 本程序連接COM1 串口測(cè)試程序連接COM2 程序界面如下圖 圖2 2 6串口數(shù)據(jù)的接收 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 其中文本框名字為t1 按鈕名字為btnStart 對(duì)應(yīng)的后臺(tái)代碼如下 privateSerialPortsp privatevoidForm1 Load objectsender EventArgse sp newSerialPort COM1 9600 Parity None 8 StopBits One sp Open privatevoidForm1 FormClosing objectsender FormClosingEventArgse if sp null 10秒內(nèi)沒(méi)有收到回復(fù)數(shù)據(jù) 將捕獲到異常try 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 first byte sp ReadByte 同步讀取 程序在此被阻塞 tmp newbyte sp BytesToRead 1 tmp 0 first sp Read tmp 1 tmp Length 1 讀取剩余字節(jié)到tmp數(shù)組中 接收的數(shù)據(jù)以十六進(jìn)制形式顯示在文本框t1中t1 Text CCheck BinaryToHexString tmp catch TimeoutExceptionex t1 Text ex Message 在文本框t1中顯示異常信息 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 以下代碼包含在CCheck類中 publicclassCCheck 字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串publicstaticstringBinaryToHexString byte buff StringBuildertmp newStringBuilder for inti 0 i buff Length i tmp Append buff i ToString X2 returntmp ToString Trim 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 該程序在點(diǎn)擊 開(kāi)始接收 按鈕后會(huì)停止對(duì)用戶輸入的響應(yīng) 這是因?yàn)檎{(diào)用ReadByte方法造成當(dāng)前線程被阻塞 直到下位機(jī)發(fā)送的數(shù)據(jù)到達(dá) 或接收超時(shí)才解除阻塞 實(shí)際操作時(shí) 先運(yùn)行該程序 再打開(kāi)串口測(cè)試工具 并連接COM2 在測(cè)試工具中輸入一些數(shù)據(jù) 做好發(fā)送的準(zhǔn)備工作 在程序點(diǎn)擊 開(kāi)始接收 按鈕后 立即切換到串口測(cè)試工具 并點(diǎn)擊 發(fā)送 按鈕 就可以在程序中看到發(fā)送過(guò)來(lái)的數(shù)據(jù) 發(fā)送 操作要在10秒內(nèi)完成 否則會(huì)引起 接收超時(shí) 異常 4接收數(shù)據(jù)的緩存和數(shù)據(jù)幀的提取 1 創(chuàng)建數(shù)據(jù)接收隊(duì)列CRecvBuf是一個(gè)用于緩存接收數(shù)據(jù)的類 利用List類來(lái)實(shí)現(xiàn) 在創(chuàng)建該類的實(shí)例時(shí) 要指定參數(shù)maxLength 表示隊(duì)列的總?cè)萘?即圖2 2 1中的參數(shù)L 每當(dāng)接收到一段數(shù)據(jù) 就調(diào)用Add方法將收到的數(shù)據(jù)添加到隊(duì)列中 Add方法中判斷添加數(shù)據(jù)后字節(jié)數(shù)是否超過(guò)maxLength 并將超出部份從隊(duì)首刪除 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 classCRecvBuf publicListli publicintmaxLength publicCRecvBuf intmaxLength li newList this maxLength maxLength publicvoidAdd byte b if b Length maxLength thrownewException 接收到的數(shù)據(jù)量超出緩沖區(qū)長(zhǎng)度 li AddRange b if li Count maxLength li RemoveRange 0 li Count maxLength 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 2 使用數(shù)據(jù)接收隊(duì)列當(dāng)HSDZC電能綜合測(cè)試儀工作在 測(cè)量方式2 的情況下 使用下面的程序可以接收數(shù)據(jù) 并使用前面設(shè)計(jì)的CRecvBuf類的實(shí)例緩存接收到的數(shù)據(jù) 再?gòu)闹刑崛〕鲆粋€(gè)完整數(shù)據(jù)幀 程序運(yùn)行界面如圖2 2 7 2 2 7利用隊(duì)列緩存接收數(shù)據(jù) 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 當(dāng)按下 開(kāi)始 按鈕時(shí) 上位機(jī)準(zhǔn)備接收數(shù)據(jù) 等待時(shí)間為10秒 此時(shí)通過(guò)串口測(cè)試程序按HSDZC電能綜合測(cè)試儀工作在 測(cè)量方式2 時(shí)的數(shù)據(jù)格式 向上位機(jī)發(fā)送一個(gè)數(shù)據(jù)片段 上位機(jī)采用3個(gè)步驟處理接收數(shù)據(jù) 第1步接收到下位機(jī)發(fā)送的數(shù)據(jù) 第2步將接收的數(shù)據(jù)添加到隊(duì)列中 第3步從隊(duì)列中根據(jù)起始標(biāo)志和約定數(shù)據(jù)長(zhǎng)度提取出一個(gè)完整的數(shù)據(jù)幀 后臺(tái)代碼如下 privateSerialPortsp privateCRecvBufrecvBuf privatevoidbtnStart Click objectsender EventArgse bytefirstByte byte tmp sp ReadTimeout 10000 10秒內(nèi)沒(méi)有收到回復(fù)數(shù)據(jù) 將捕獲到異常try firstByte byte sp ReadByte 讀取第1個(gè)回復(fù)字節(jié) 程序在此被阻塞 學(xué)習(xí)情景2 2串口設(shè)備數(shù)據(jù)的接收和處理 tmp newbyte sp BytesToRead 1 tmp 0 firstByte sp Read tmp 1 tmp Length 1 讀取剩余字節(jié)到tmp數(shù)組中t1 Text CCheck BinaryToHexString tmp 接收數(shù)據(jù)顯示在文本框t1中recvBuf Add tmp 添加接收數(shù)據(jù)到隊(duì)列中 顯示隊(duì)列中的全部數(shù)據(jù)t2 Text CCheck BinaryToHexString recvBuf getAllData 提取一個(gè)完整的數(shù)據(jù)幀tmp getBlock recvBuf li if tmp null t3 Text CCheck BinaryToHexString tmp 顯示在文本
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- WPS文字編輯功能使用試題及答案
- 計(jì)算機(jī)一級(jí)WPS 文檔格式設(shè)置試題及答案
- 法學(xué)概論法律與技術(shù)結(jié)合的法律問(wèn)題試題及答案
- 2025年即時(shí)配送行業(yè)報(bào)告:配送路徑優(yōu)化與成本控制在冷鏈物流中的關(guān)鍵作用
- 開(kāi)發(fā)環(huán)境配置與優(yōu)化的必要性試題及答案
- Photoshop構(gòu)圖與排版技巧試題及答案
- 2025年計(jì)算機(jī)一級(jí)燈光與陰影效果試題及答案
- MS Office非常用技巧分析試題及答案
- WPS電子表格深入操作試題及答案
- 法學(xué)概論的社區(qū)與公民參與考察試題及答案
- 2023-2024學(xué)年上海市寶山區(qū)八年級(jí)(下)期末數(shù)學(xué)試卷 (含答案)
- 2025年中考數(shù)學(xué)模擬考試卷(附答案)
- 汽車合伙合同協(xié)議書(shū)
- 四川省九師聯(lián)盟2025屆高三仿真模擬卷物理試卷及答案(HG)
- 2025年保密法基礎(chǔ)知識(shí)考試題庫(kù)帶答案(預(yù)熱題)參考答案詳解
- 乙狀結(jié)腸癌試題及答案
- 2025夏季安徽蚌埠市東方人力資源有限勞務(wù)派遣人員招聘30人筆試參考題庫(kù)附帶答案詳解
- 2024年貴州銅仁公開(kāi)招聘社區(qū)工作者考試試題答案解析
- 2025年中央民族大學(xué)輔導(dǎo)員招聘考試筆試試題(含答案)
- 江蘇蘇州國(guó)家歷史文化名城保護(hù)區(qū)、蘇州市姑蘇區(qū)區(qū)屬國(guó)資集團(tuán)招聘筆試題庫(kù)2025
- 2025屆山東濟(jì)南市下學(xué)期高三數(shù)學(xué)試題5月(第三次)模擬考試試卷
評(píng)論
0/150
提交評(píng)論