亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        劉馬飛

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

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

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

        0 引 言

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

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

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

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

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

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

        1.2 串口通信基礎(chǔ)

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

        傳感層設(shè)備常用的核心芯片是單片機(jī),80C51單片機(jī)的P3口有兩個(gè)復(fù)用接口,分別為RXD和TXD,而這也是單片機(jī)進(jìn)行串行通信的收發(fā)口,但單片機(jī)采用的是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,所以需要通過(guò)MAX232芯片實(shí)現(xiàn)TTL電平與RS 232電平之間的轉(zhuǎn)換。

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

        5位、7位和8位,通常8意為8位對(duì)應(yīng)一個(gè)字節(jié)的8個(gè)比特。校驗(yàn)位可選,進(jìn)行校驗(yàn)時(shí),可以在偶、奇、高和低四種校驗(yàn)方式中任選一種。停止位表示字符幀結(jié)束,一般取1,1.5和2位(邏輯1)。每個(gè)位的持續(xù)時(shí)間由波特率表示,典型取值為1 200 bps,2 400 bps,4 800 bps,9 600 bps,19 200 bps。對(duì)于兩個(gè)串口通信的設(shè)備而言,只有兩端的波特率、數(shù)據(jù)位、校驗(yàn)位以及停止位保持一致,才能保證發(fā)送的每個(gè)數(shù)據(jù)包都能夠被對(duì)方正確接收。串口通信系統(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ù)文件操作思想,在進(jìn)行串口操作之前首先需要調(diào)用Open()方法對(duì)打開串口;串口打開后,調(diào)用Write()函數(shù)等將數(shù)據(jù)通過(guò)串口發(fā)送出去,再調(diào)用Read()函數(shù)從串口接收對(duì)端發(fā)送的數(shù)據(jù),串口操作完成后,需調(diào)用Close()方法關(guān)閉串口。

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

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

        2.1 窗體設(shè)計(jì)

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

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

        2.2.1 程序初始化

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

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

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

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

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

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

        2.3 系統(tǒng)改進(jìn)及擴(kuò)展

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

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

        3 結(jié) 語(yǔ)

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

        參 考 文 獻(xiàn)

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

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

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

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

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

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

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

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

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

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

        猜你喜歡
        控件線程串口
        淺談AB PLC串口跟RFID傳感器的通訊應(yīng)用
        關(guān)于.net控件數(shù)組的探討
        軟件(2018年7期)2018-08-13 09:44:42
        淺談linux多線程協(xié)作
        USB接口的多串口數(shù)據(jù)并行接收方法探索
        基于藍(lán)牙串口適配器的GPS接收機(jī)與AutoCAD的實(shí)時(shí)無(wú)線通信
        基于并行控制的FPGA多串口拓展實(shí)現(xiàn)
        Linux線程實(shí)現(xiàn)技術(shù)研究
        就這樣玩會(huì)VBA中常見的自定義控件
        電腦迷(2012年24期)2012-04-29 00:44:03
        么移動(dòng)中間件線程池并發(fā)機(jī)制優(yōu)化改進(jìn)
        在PowerBuUder中利用WinSock控件制作簡(jiǎn)單的Web服務(wù)器
        欧美极品jizzhd欧美| 一区二区三区极品少妇| 精品人妻久久一区二区三区| 国产精品免费av片在线观看| 成人免费ā片在线观看| 91免费国产| 熟女人妻一区二区三区| 乱人伦中文视频在线| 亚洲乱码av中文一区二区| 麻豆国产乱人伦精品一区二区 | 帅小伙自慰videogay男男| 爱情岛永久地址www成人| 蜜桃在线播放免费一区二区三区 | 亚洲自偷精品视频自拍| 99精品国产高清一区二区麻豆| 中文字幕无码免费久久99| 高清不卡av在线播放| 色88久久久久高潮综合影院| 亚洲中文字幕无码久久2020| 无码人妻专区一区二区三区| 加勒比日韩视频在线观看 | 久久久久亚洲av片无码v| 任你躁国产自任一区二区三区| 高清国产精品一区二区| 人妻熟妇乱又伦精品hd| 99久久精品国产成人综合| 国产美女精品AⅤ在线老女人| 中文av字幕一区二区三区| 免费视频爱爱太爽了| 最新国产在线精品91尤物| 亚洲精品乱码久久麻豆| 日韩精品无码熟人妻视频| 日本老熟欧美老熟妇| 日日噜噜夜夜狠狠久久av| 黄片小视频免费观看完整版 | 又色又爽又黄的视频网站| 伊人青青草综合在线视频免费播放| 97在线观看视频| 久久亚洲AV成人一二三区| av一区二区在线免费观看| 欧美人牲交|