串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第1頁
串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第2頁
串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第3頁
串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第4頁
串口設(shè)備數(shù)據(jù)的接收和處理.ppt_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)行分析和處理。利用.NET Framework 2.0及更高版本提供的SerialPort類可以比較方便地在C#應(yīng)用程序中實(shí)現(xiàn)串口通信功能。從編程的角度看,串口數(shù)據(jù)的接收就是利用SerialPort對(duì)象的Read或ReadByte方法將操作系統(tǒng)存放在串口輸入緩沖區(qū)中的數(shù)據(jù)讀入到一個(gè)字節(jié)數(shù)組中。 該教學(xué)情景通過串口數(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í) 1 SerialPort類實(shí)例的構(gòu)造 SerialPort類是從.NET Framework 2.0版本開始提供的一個(gè)串口控制類,該類包含在System.IO.Ports命名空間中,使用該類的實(shí)例可以打開串口,并發(fā)送數(shù)據(jù)。 通過構(gòu)造函數(shù)可以產(chǎn)生SerialPort類的實(shí)例,SerialPort類的構(gòu)造函數(shù)在定義時(shí)進(jìn)行了重載,表2.2.1中列出了這些重載構(gòu)造函數(shù)的接口定義:,表2.2.1 SerialPort類的構(gòu)造函數(shù)定義,表2.2.1 SerialPort類的構(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í)例后,還可以通過PortName、BaudRate、Parity、DataBits、StopBits屬性對(duì)這些參數(shù)進(jìn)行修改,因此構(gòu)造SerialPort類實(shí)例的程序書寫形式比較靈活。 2 串口的打開和關(guān)閉 SerialPort類中與串口打開和關(guān)閉相關(guān)的成員如下: (1)Open方法 Open方法打開新的串口連接,該方法不帶參數(shù),接口定義如下: public void Open() (2)Close方法 Close方法關(guān)閉已經(jīng)打開的串口連接,該方法不帶參數(shù),接口定義如下: public void Close(),學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,學(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é),該方法的接口定義是: public int Read(byte buffer, int offset, int count); 該方法試圖從接收緩沖區(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í),通常先通過SerialPort對(duì)象的BytesToRead屬性獲得接收緩沖區(qū)中已有的字節(jié)數(shù),并根據(jù)該屬性值來設(shè)置count參數(shù)。 和ReadByte方法不同的是,調(diào)用Read方法時(shí),不管接收緩沖區(qū)中有無數(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ā)送過來的數(shù)據(jù)沒有在ReadTimeout規(guī)定的時(shí)間內(nèi)到達(dá),則會(huì)引發(fā)TimeoutException,應(yīng)用程序可以捕獲該異常,并作相應(yīng)處理。下面的測(cè)試程序說明了超時(shí)異常處理的方法: SerialPort sp; private void btnStart_Click (object sender, EventArgs e) byte firstByte; sp.ReadExisting(); /清空接收緩沖區(qū),準(zhǔn)備接收數(shù)據(jù) sp.ReadTimeout = 10000; /10秒內(nèi)沒有收到回復(fù)數(shù)據(jù),將捕獲到異常 try firstByte = (byte)sp.ReadByte(); /同步讀?。ǔ绦蛟诖吮蛔枞?t1.Text = firstByte.ToString(“X2“); /顯示在文本框t1中 catch (TimeoutException ex) /捕獲到接收超時(shí)異常 t1.Text = ex.Message; /在t1中顯示異常信息 ,學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,圖2.2.1 接收超時(shí)異常測(cè)試 如上圖所示,在點(diǎn)擊“開始”按鈕后,程序被阻塞,此時(shí)窗口對(duì)鼠標(biāo)和鍵盤的輸入都不響應(yīng)。為了有足夠操作時(shí)間,SerialPort對(duì)象sp的ReadTimeout屬性為10000毫秒(10秒)。在10秒時(shí)間內(nèi),測(cè)試者可以通過串口測(cè)試程序發(fā)送一個(gè)或多個(gè)字節(jié)過來,此時(shí)程序結(jié)束阻塞狀態(tài)繼續(xù)運(yùn)行,并在文本框中顯示接收到的第1個(gè)字節(jié);如果10秒內(nèi)沒有數(shù)據(jù)到達(dá),則引發(fā)TimeoutException。 若上位機(jī)程序要一直等待,可以把ReadTimeout屬性的值設(shè)置為-1,但在實(shí)際應(yīng)用中一般不這樣做。,學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,5 HSDZC電能綜合測(cè)試儀的數(shù)據(jù)格式 HSDZC電能綜合測(cè)試儀在鉆機(jī)性能測(cè)試系統(tǒng)中用于輸入功率、輸出功率以及功率因素(參見引言介紹)。該設(shè)備提供兩種電腦測(cè)量方式,在儀表提示“測(cè)量方式”時(shí),可以分別按“顯示1”和“顯示2”進(jìn)入。 在測(cè)量方式1的情況下測(cè)試儀每秒通過RS-232接口發(fā)送1組數(shù)據(jù),長(zhǎng)度46字節(jié)。信號(hào)格式:開始4字節(jié)均為FFH,后續(xù)每三個(gè)字節(jié)構(gòu)成一個(gè)浮點(diǎn)數(shù)值,分別表示I1、U1、I2、U2、I3、U3,以及功率因數(shù)、視在功率、效率、輸入功率、無功功率、負(fù)載率、輸出功率、轉(zhuǎn)速,共14個(gè)數(shù)據(jù)。 在測(cè)量方式2的情況下測(cè)試儀也是每秒通過RS-232接口發(fā)送1組數(shù)據(jù),長(zhǎng)度30字節(jié)。信號(hào)格式:開始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ā)送過來的數(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ù)的算法: private float HexToFloat(byte B1, byte B2, byte B3) float f, 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ù) 在通信過程中,數(shù)據(jù)幀表示由多個(gè)字節(jié)構(gòu)成的,具有一定格式,表示完整語意的一組數(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é)的集合來對(duì)接收到的數(shù)據(jù)進(jìn)行緩存(暫存),在確認(rèn)接收完畢一幀數(shù)據(jù)后,再進(jìn)行進(jìn)一步的分析和處理。 .NET Framework 2.0以上版本提供了List類來實(shí)現(xiàn)集合元素管理。List類支持泛型,在存取byte類型的集合元素時(shí)無需進(jìn)行“裝箱”和“拆箱”操作,比使用ArrayList效率高。,學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,List類提供了豐富的方法來對(duì)集合中的元素進(jìn)行操作,表2.2.3列出了List類的常用方法,表中的示例建立在如下定義的基礎(chǔ)上: byte b; byte ba; List li = new List(); /創(chuàng)建List類的實(shí)例li,元素類型為byte 表2.2.3 List類的常用方法,學(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)行處理,新來的數(shù)據(jù)從隊(duì)尾進(jìn),如果原有數(shù)據(jù)字節(jié)數(shù)加上新接收字節(jié)數(shù)超過集合的最大容量,則將隊(duì)首的部份數(shù)據(jù)刪除。圖2.2.2展示數(shù)據(jù)入隊(duì)和出隊(duì)的過程: L-隊(duì)列總?cè)萘?N-原有字節(jié)數(shù) M-新接收字節(jié)數(shù) (1)隊(duì)列剩余空間能容納新接收數(shù)據(jù) L-隊(duì)列總?cè)萘?N-原有字節(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)用程序的開發(fā)在Visual Studio集成開發(fā)環(huán)境中進(jìn)行,首先創(chuàng)建一個(gè)基于C#語言的“Windows應(yīng)用程序”項(xiàng)目,名為“ReceiveData”,并存放在工作目錄“F:SerialPort”下,如圖2.2.3所示:,學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,2 SerialPort對(duì)象的創(chuàng)建 創(chuàng)建SerialPort對(duì)象可以通過添加控件和編寫代碼兩種方式,添加控件的方式相對(duì)簡(jiǎn)單,適合初學(xué)者練習(xí);編寫代碼的方式具有較強(qiáng)的靈活性,可以把SerialPort對(duì)象對(duì)串口的操作細(xì)節(jié)隱藏起來,與數(shù)據(jù)編碼、解碼等功能一起封裝為一個(gè)功能完整的串口通信模塊。 (1)通過添加控件創(chuàng)建SerialPort對(duì)象 在“工具箱”中展開“組件”選項(xiàng)卡,選擇“SerialPort”組件(如圖 2.2.4),用鼠標(biāo)拖動(dòng)到設(shè)計(jì)視圖中的窗口上。由于SerialPort是不可見組件,所以不直接出現(xiàn)在窗體上,而是出現(xiàn)在窗口下方,如圖2.2.5所示。 該操作的實(shí)質(zhì)是在窗體設(shè)計(jì)器的源代碼(文件名Form1.Designer.cs)中添加了如下代碼: private System.IO.Ports.SerialPort serialPort1; this.serialPort1 = new System.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命名空間: using System.IO.Ports; 然后定義SerialPort類的對(duì)象sp,作為Form1類的私有成員: private SerialPort sp; 最后在Form1類的構(gòu)造函數(shù)中創(chuàng)建對(duì)象: public Form1() InitializeComponent(); sp = new SerialPort(); ,學(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)擊“開始接收”按鈕時(shí),程序調(diào)用SerialPort對(duì)象的ReadByte方法,阻塞當(dāng)前線程,并開始接收下位機(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)代碼如下: private SerialPort sp; private void Form1_Load(object sender, EventArgs e) sp = new SerialPort(“COM1“, 9600, Parity.None, 8, StopBits.One); sp.Open(); private void Form1_FormClosing(object sender, FormClosingEventArgs e) if (sp != null /10秒內(nèi)沒有收到回復(fù)數(shù)據(jù),將捕獲到異常 try,學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理, first = (byte)sp.ReadByte(); /同步讀?。ǔ绦蛟诖吮蛔枞?tmp = new bytesp.BytesToRead + 1; tmp0 = first; sp.Read(tmp, 1, tmp.Length - 1); /讀取剩余字節(jié)到tmp數(shù)組中 /接收的數(shù)據(jù)以十六進(jìn)制形式顯示在文本框t1中 t1.Text = CCheck.BinaryToHexString(tmp); catch (TimeoutException ex) t1.Text = ex.Message; /在文本框t1中顯示異常信息 ,學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,/以下代碼包含在CCheck類中: public class CCheck /字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串 public static string BinaryToHexString(byte buff) StringBuilder tmp = new StringBuilder(); for (int i = 0; i buff.Length; i+) tmp.Append(buffi.ToString(“X2“) + “ “); return tmp.ToString().Trim(); ,學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,該程序在點(diǎn)擊“開始接收”按鈕后會(huì)停止對(duì)用戶輸入的響應(yīng),這是因?yàn)檎{(diào)用ReadByte方法造成當(dāng)前線程被阻塞,直到下位機(jī)發(fā)送的數(shù)據(jù)到達(dá),或接收超時(shí)才解除阻塞。 實(shí)際操作時(shí),先運(yùn)行該程序,再打開串口測(cè)試工具,并連接COM2,在測(cè)試工具中輸入一些數(shù)據(jù),做好發(fā)送的準(zhǔn)備工作。在程序點(diǎn)擊“開始接收”按鈕后,立即切換到串口測(cè)試工具,并點(diǎn)擊“發(fā)送”按鈕,就可以在程序中看到發(fā)送過來的數(shù)據(jù)?!鞍l(fā)送”操作要在10秒內(nèi)完成,否則會(huì)引起“接收超時(shí)”異常。 4接收數(shù)據(jù)的緩存和數(shù)據(jù)幀的提取 (1)創(chuàng)建數(shù)據(jù)接收隊(duì)列 CRecvBuf是一個(gè)用于緩存接收數(shù)據(jù)的類,利用List類來實(shí)現(xiàn)。在創(chuàng)建該類的實(shí)例時(shí),要指定參數(shù)maxLength,表示隊(duì)列的總?cè)萘浚磮D2.2.1中的參數(shù)L)。每當(dāng)接收到一段數(shù)據(jù),就調(diào)用Add方法將收到的數(shù)據(jù)添加到隊(duì)列中,Add方法中判斷添加數(shù)據(jù)后字節(jié)數(shù)是否超過maxLength,并將超出部份從隊(duì)首刪除。,學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,class CRecvBuf public List li; public int maxLength; public CRecvBuf(int maxLength) li = new List(); this.maxLength = maxLength; public void Add(byte b) if (b.Length maxLength) throw new Exception(“接收到的數(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)按下“開始”按鈕時(shí),上位機(jī)準(zhǔn)備接收數(shù)據(jù),等待時(shí)間為10秒,此時(shí)通過串口測(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)代碼如下: private SerialPort sp; private CRecvBuf recvBuf; private void btnStart_Click(object sender, EventArgs e) byte firstByte; byte tmp; sp.ReadTimeout = 10000; /10秒內(nèi)沒有收到回復(fù)數(shù)據(jù),將捕獲到異常 try firstByte = (byte)sp.ReadByte(); /讀取第1個(gè)回復(fù)字節(jié)(程序在此被阻塞),學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,tmp = new bytesp.BytesToRead + 1; tmp0 = 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); /顯示在文本框t3中 else t3.Text = “; ,學(xué)習(xí)情景2.2 串口設(shè)備數(shù)據(jù)的接收和處理,catch (TimeoutExceptio

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論