• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于C#的串口通信系統(tǒng)的設(shè)計和實現(xiàn)

      2019-07-29 01:12劉馬飛
      物聯(lián)網(wǎng)技術(shù) 2019年6期
      關(guān)鍵詞:控件線程串口

      劉馬飛

      摘 要:物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)學(xué)生在學(xué)習(xí)完C#.NET程序設(shè)計課程后,雖然掌握了一定的C#軟件編程知識,但在如何編寫軟件程序驅(qū)動物聯(lián)網(wǎng)底層傳感設(shè)備,構(gòu)建物聯(lián)網(wǎng)實際應(yīng)用時仍然束手無策。物聯(lián)網(wǎng)底層傳感設(shè)備大都為RS 232串口通信設(shè)備,文中給出一個有實用價值的簡單設(shè)計—基于C#的串口通信系統(tǒng)的設(shè)計和實現(xiàn),練習(xí)使用所學(xué)的C#編程知識完成與物聯(lián)網(wǎng)底層設(shè)備的交互,加強物聯(lián)網(wǎng)專業(yè)學(xué)生構(gòu)建應(yīng)用系統(tǒng)的編程能力。

      關(guān)鍵詞:C#;RS 232;串口通信;程序設(shè)計;軟件編程;物聯(lián)網(wǎng)

      中圖分類號:TP393 文獻標(biāo)識碼:A 文章編號:2095-1302(2019)06-00-04

      0 引 言

      高職院校普遍將《C++程序設(shè)計》課程定為計算機大類專業(yè)的基礎(chǔ)主干課程,同時也是物聯(lián)網(wǎng)應(yīng)用技術(shù)、電子信息技術(shù)等專業(yè)的專業(yè)基礎(chǔ)課。在物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)的教學(xué)安排中,大都在學(xué)習(xí)完C++,對程序控制、類和對象等概念有了基礎(chǔ)了解后,方才進一步學(xué)習(xí)C#程序設(shè)計。C#程序設(shè)計授課教師,尤其是來自軟件方向的教師,在課程教學(xué)中一般會把窗體程序界面設(shè)計等可視化程序設(shè)計作為授課主要內(nèi)容,常常忽略了與硬件設(shè)備交互的部分。因此物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)學(xué)生在進行綜合項目開發(fā)時,常常無從下手。物聯(lián)網(wǎng)底層傳感設(shè)備大都為單片機控制設(shè)備,其與外界通信的接口常采用RS 232串口[1]。在構(gòu)建物聯(lián)網(wǎng)應(yīng)用系統(tǒng)時,需要計算機應(yīng)用程序與物聯(lián)網(wǎng)底層傳感設(shè)備進行通信交互,實現(xiàn)價值應(yīng)用。

      為促進物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)人才的培養(yǎng),無錫職業(yè)技術(shù)學(xué)院物聯(lián)網(wǎng)學(xué)院經(jīng)過精心設(shè)計,開設(shè)了《物聯(lián)設(shè)備編程與實施》課程,該課程的目的在于突出基于物聯(lián)網(wǎng)設(shè)備進行C#軟件開發(fā),旨在提升物聯(lián)網(wǎng)專業(yè)學(xué)生的軟件開發(fā)能力和系統(tǒng)構(gòu)建能力,并將其打造成為職業(yè)教育物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)教學(xué)資源庫的主干核心課程[1-2]。該課程的核心教學(xué)內(nèi)容之一便是C#串口編程。物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)學(xué)生中普遍存在因課外缺少串口硬件設(shè)備而無法練習(xí)串口編程內(nèi)容的問題。

      為了讓學(xué)生能在課外學(xué)習(xí)C#串口編程知識,提高對課程內(nèi)容的掌握程度,本文介紹了一個基于C#的串口數(shù)據(jù)收發(fā)系統(tǒng)的設(shè)計和實現(xiàn)案例,通過案例的介紹,指導(dǎo)物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)學(xué)生使用所學(xué)的C#編程知識完成與物聯(lián)網(wǎng)底層設(shè)備的交互,提升構(gòu)建物聯(lián)網(wǎng)應(yīng)用系統(tǒng)的編程能力。

      1 系統(tǒng)設(shè)計原理及知識

      1.1 系統(tǒng)功能設(shè)計

      C#串口數(shù)據(jù)收發(fā)系統(tǒng)具有串口發(fā)送和串口接收功能。串口發(fā)送:通過點擊發(fā)送按鈕將發(fā)送文本框內(nèi)的字符串?dāng)?shù)據(jù)通過串口發(fā)送出去;串口接收:從串口接收數(shù)據(jù)并轉(zhuǎn)成字符串顯示到接收文本框中。為了便于學(xué)生在課后缺少串口設(shè)備的情況下也能進行程序調(diào)試,可通過虛擬串口軟件Virtual Serial Port Driver添加一對虛擬串口,該串口的數(shù)據(jù)收發(fā)系統(tǒng)和常規(guī)串口調(diào)試助手可分別連接到這一對虛擬串口上,便于通過串口收發(fā)數(shù)據(jù)。

      1.2 串口通信基礎(chǔ)

      串口通信是指外設(shè)和計算機間通過數(shù)據(jù)信號線、地線、控制線等,按位進行傳輸數(shù)據(jù)的一種通信方式[3]。其中最常用的一種串行通信接口為RS 232C,其全名是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通信設(shè)備(DCE)之間串行二進制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”。RS 232串行口物理接口示意如圖1所示,其中2腳表示輸入引腳RXD,3腳表示輸出引腳TXD,5腳表示接地。RS 232C全雙工的兩端只需要如圖2所示連接三個引腳,便可進行全雙工通信。

      傳感層設(shè)備常用的核心芯片是單片機,80C51單片機的P3口有兩個復(fù)用接口,分別為RXD和TXD,而這也是單片機進行串行通信的收發(fā)口,但單片機采用的是TTL電平標(biāo)準(zhǔn),+5 V表示邏輯1,0 V表示邏輯0;而RS 232電平標(biāo)準(zhǔn)要求+15 V或+13 V表示邏輯1,-15 V或-13 V表示邏輯0,所以需要通過MAX232芯片實現(xiàn)TTL電平與RS 232電平之間的轉(zhuǎn)換。

      RS 232串口以字符幀為單位傳送數(shù)據(jù),字符幀由起始位、數(shù)據(jù)位、校驗位以及停止位構(gòu)成,如圖3所示。起始位固定為1位,邏輯0表明字符幀開始;數(shù)據(jù)位的位數(shù)可選值為

      5位、7位和8位,通常8意為8位對應(yīng)一個字節(jié)的8個比特。校驗位可選,進行校驗時,可以在偶、奇、高和低四種校驗方式中任選一種。停止位表示字符幀結(jié)束,一般取1,1.5和2位(邏輯1)。每個位的持續(xù)時間由波特率表示,典型取值為1 200 bps,2 400 bps,4 800 bps,9 600 bps,19 200 bps。對于兩個串口通信的設(shè)備而言,只有兩端的波特率、數(shù)據(jù)位、校驗位以及停止位保持一致,才能保證發(fā)送的每個數(shù)據(jù)包都能夠被對方正確接收。串口通信系統(tǒng)界面如圖4所示。

      1.3 C#串口控件

      在C#.NET中提供SerialPort類用于完成串口通信操作,其屬于System.IO.Ports命名空間,在C#Windows窗體應(yīng)用程序中經(jīng)SerialPort類封裝成可視化控件SerialPort,使用可視化方式完成編程。SerialPort類的常用屬性和常用方法見表1和表2所列[1,4]。

      SerialPort串口操作延續(xù)文件操作思想,在進行串口操作之前首先需要調(diào)用Open()方法對打開串口;串口打開后,調(diào)用Write()函數(shù)等將數(shù)據(jù)通過串口發(fā)送出去,再調(diào)用Read()函數(shù)從串口接收對端發(fā)送的數(shù)據(jù),串口操作完成后,需調(diào)用Close()方法關(guān)閉串口。

      應(yīng)用程序從串口讀取數(shù)據(jù)時,由于不知串口對端發(fā)送過來的數(shù)據(jù)何時到達接收緩沖區(qū),因而面臨著“不知何時讀”的困境,其解決方式通常有兩種,其一是開啟一個新的線程,不斷讀取串口數(shù)據(jù);其二是采用事件觸發(fā)方式。SerialPort封裝了自動觸發(fā)事件,設(shè)定有串口緩沖區(qū)接收到的字符個數(shù)(屬性ReceivedBytesThreshold值),當(dāng)接收緩沖區(qū)的字節(jié)數(shù)大于等于該值時,系統(tǒng)將自動觸發(fā)DataReceive事件。因此可以添加DataReceive事件的響應(yīng)函數(shù),在該響應(yīng)函數(shù)中讀取數(shù)據(jù)。需要注意的是,事件觸發(fā)方式通過創(chuàng)建線程來實現(xiàn),但監(jiān)聽線程的創(chuàng)建由C#內(nèi)部系統(tǒng)來完成,因此在代碼實現(xiàn)上更加簡便。

      2 功能設(shè)計和程序?qū)崿F(xiàn)

      2.1 窗體設(shè)計

      在Visual Studio開發(fā)環(huán)境中創(chuàng)建如圖4所示的應(yīng)用程序窗體。程序運行時,首先選擇相應(yīng)的串口和波特率打開串口,串口打開后便可通過發(fā)送按鈕將發(fā)送文本框內(nèi)的字符串?dāng)?shù)據(jù)發(fā)送到串口對端,而串口接收到的數(shù)據(jù)將自動轉(zhuǎn)換成字符串顯示在接收文本框中。

      2.2 邏輯實現(xiàn)及關(guān)鍵代碼

      2.2.1 程序初始化

      計算機存在多個串行口,因此程序運行時首先需要列出計算機所有可用串口供用戶選擇,同時進行程序邏輯初始化,確保串口未打開時無法點擊發(fā)送按鈕進行發(fā)送操作。因此添加窗口Load事件響應(yīng)函數(shù),在Load事件響應(yīng)函數(shù)中完成上述初始化操作。

      序使用SerialPort類而非SerialPort控件或編寫非Windows窗體應(yīng)用程序的C#程序時,需要定義SerialPort類對象作為成員對象,并進行SerialPort對象初始化和DataReceived事件響應(yīng)回調(diào)函數(shù)關(guān)聯(lián)操作,初始化通常在窗體構(gòu)造函數(shù)中進行。

      2.2.4 串口接收數(shù)據(jù)

      串口數(shù)據(jù)接收采用事件觸發(fā)方式,添加串口控件的DataReceived事件響應(yīng)函數(shù),在該響應(yīng)函數(shù)中進行數(shù)據(jù)接收操作。接收時首先調(diào)用BytesToRead屬性,獲得串口字符個數(shù);其次定義與字符個數(shù)相對應(yīng)的字節(jié)數(shù)組;最后調(diào)用Read方法,把串口數(shù)據(jù)讀入字節(jié)數(shù)組,并將字節(jié)數(shù)組按指定編碼格式轉(zhuǎn)換回字符串進行顯示[5]。

      由于事件觸發(fā)方式系統(tǒng)創(chuàng)建了監(jiān)聽線程進行串口接收緩沖區(qū)監(jiān)聽,當(dāng)接收緩沖區(qū)字節(jié)數(shù)超過串口控件屬性ReceivedBytesThreshold值時,將產(chǎn)生DataReceived事件。當(dāng)DataReceived事件被處理時,才會調(diào)用DataReceived事件相應(yīng)函數(shù),即spdemo_DataReceived。通常串口對端發(fā)送數(shù)據(jù)包的大小非固定,因此ReceivedBytesThreshold通常采用默認值1。當(dāng)串口接收緩沖區(qū)收到數(shù)據(jù)包第一個字節(jié)時,便輔助線程產(chǎn)生DataReceived事件。當(dāng)該DataReceived事件被處理時,有可能數(shù)據(jù)包還未接收完畢,因此可采用一個簡單但低效、不可靠的辦法執(zhí)行Thread.Sleep(10)操作使線程休眠100 ms,使得在執(zhí)行讀取操作時,數(shù)據(jù)包接收完畢[6]。

      由于事件觸發(fā)方式中,DataReceived事件的響應(yīng)函數(shù)spdemo_DataReceived()是在系統(tǒng)創(chuàng)建的輔助監(jiān)聽線程上執(zhí)行的,而窗體界面的控件則是在主線上創(chuàng)建的,因此為避免線程競爭,C#窗體編程只能創(chuàng)建控件的線程來操作控件數(shù)據(jù),禁止跨線程訪問控件資源。因此需要使用Invoke或BeginInvoke方法,通過委托調(diào)用封送到主線程上執(zhí)行,具體實現(xiàn):this.Invoke((EventHandler)(delegate{界面控件使用}))。

      2.3 系統(tǒng)改進及擴展

      本系統(tǒng)設(shè)計本著可用、簡單的原則,設(shè)計了字符串文本的發(fā)送和接收顯示,方便學(xué)生實現(xiàn)。一旦學(xué)生掌握了基本的實現(xiàn)方法,就可以在該基礎(chǔ)上完善功能,擴展應(yīng)用。例如設(shè)計溫濕度監(jiān)控應(yīng)用程序時通過RS 232串口連接傳感層單片機設(shè)備,接收傳感層設(shè)備通過串口上傳的溫度濕度等傳感數(shù)據(jù)并展示。設(shè)計硬件設(shè)備控制程序時,通過串口發(fā)送操作指令數(shù)據(jù)到底層執(zhí)行器設(shè)備,如控制LED燈進行相應(yīng)開關(guān)操作。以上每個改進都可以比較方便的實現(xiàn),但要求學(xué)生有耐心并能自主學(xué)習(xí),激發(fā)學(xué)生學(xué)習(xí)興趣和成就感。

      系統(tǒng)在接收數(shù)據(jù)時,使用簡單的線程休眠等待數(shù)據(jù)包接收完成的辦法,在實際串口通信系統(tǒng)收發(fā)過程中將會造成數(shù)據(jù)包接收不完整以及接收處理速度慢等問題,因此需要考慮串口數(shù)據(jù)可靠、高效接收的解決方案。

      3 結(jié) 語

      本文通過基于C#的串口數(shù)據(jù)收發(fā)系統(tǒng)的設(shè)計和實現(xiàn)案例,對《物聯(lián)網(wǎng)設(shè)備編程與實施》課程中的核心知識內(nèi)容—C#串口編程進行了詳細闡述。通過介紹該項目,使得物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)的學(xué)生深入了解應(yīng)用程序如何與硬件設(shè)備交互,加深了對C#串口編程知識的理解和運用,加強了構(gòu)建物聯(lián)網(wǎng)應(yīng)用系統(tǒng)的編程能力。

      參 考 文 獻

      [1]陳天娥.物聯(lián)網(wǎng)設(shè)備編程與實施[M].北京:高等教育出版社,2014.

      [2]邱曉榮.《物聯(lián)網(wǎng)設(shè)備編程與實施》課程的構(gòu)建與實施[J].物聯(lián)網(wǎng)技術(shù),2015,5(7):96-97.

      [3]王靜霞,楊宏麗,劉俐.單片機應(yīng)用技術(shù)(C語言版)[M].3版.北京:電子工業(yè)出版社,2015.

      [4] NAGEL C,GLYNN J,SKINNER M. C#高級編程[M].9版. 李銘譯.北京:清華大學(xué)出版社,2015.

      [5]于國防,李劍.C#語言Windows程序設(shè)計[M].北京:清華大學(xué)出版社,2010.

      [6] WATSON K,HAMMER J V,REID J D. C#入門經(jīng)典[M].7版.齊立波,黃俊偉,譯.北京:清華大學(xué)出版社,2016.

      [7]胥飛燕,鄭華榮,周宦銀,等.基于FPGA的多串口控制器的設(shè)計與實現(xiàn)[J].物聯(lián)網(wǎng)技術(shù),2017,7(10):31-32.

      [8]周陽,周美嬌,黃波,等.基于C#的串口通信系統(tǒng)的設(shè)計與研究[J].電子測量技術(shù),2015,38(7):135-140.

      [9]李越,童耀南,朱凱,等.基于ZigBee和STC單片機的無線數(shù)據(jù)采集系統(tǒng)[J].物聯(lián)網(wǎng)技術(shù),2017,7(3):19-21.

      [10]吳卓葵,謝曉玲.基于單片機和C#的電壓監(jiān)測系統(tǒng)設(shè)計[J].自動化與儀器儀表,2014(4):71-73.

      猜你喜歡
      控件線程串口
      淺談AB PLC串口跟RFID傳感器的通訊應(yīng)用
      淺談linux多線程協(xié)作
      USB接口的多串口數(shù)據(jù)并行接收方法探索
      基于藍牙串口適配器的GPS接收機與AutoCAD的實時無線通信
      ASP.NET服務(wù)器端驗證控件的使用
      基于并行控制的FPGA多串口拓展實現(xiàn)
      基于上下文定界的Fork/Join并行性的并發(fā)程序可達性分析*
      Linux線程實現(xiàn)技術(shù)研究
      么移動中間件線程池并發(fā)機制優(yōu)化改進
      Spreadsheet控件在Delphi數(shù)據(jù)庫系統(tǒng)中的編程與應(yīng)用
      田东县| 蓬安县| 巴彦淖尔市| 嘉义市| 弥渡县| 青川县| 河北区| 舞钢市| 乐平市| 兰溪市| 轮台县| 神农架林区| 南安市| 甘泉县| 库伦旗| 黄石市| 台中市| 微博| 资中县| 方城县| 麻阳| 保德县| 太谷县| 陵川县| 米易县| 石台县| 含山县| 海阳市| 枣阳市| 来宾市| 文水县| 石阡县| 建宁县| 民乐县| 嘉义县| 桑植县| 会东县| 开封县| 常州市| 漯河市| 木兰县|