異步串行通信_第1頁
異步串行通信_第2頁
異步串行通信_第3頁
異步串行通信_第4頁
異步串行通信_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、*實踐教學*大學計算機與通信學院2014年秋季學期 通信系統(tǒng)綜合訓練 題 目:數字基帶信號異步串行通信系統(tǒng)設計 專業(yè)班級: 通信工程()班 姓 名: 學 號: 指導教師: 成 績: 摘 要計算機與外界的信息交換稱為通信。常用通信方式有兩種:并行通信與串行通信。串行通信又分同步和異步兩種方式。本課程設計利用51單片機與串口的線路連接、并用C語言編寫程序實現PC機與51單片機通過RS-232接口實現串行通信以及通過MATLAB的GUI實現單片機與PC端的界面通信,并能根據設置調整異步串行通信參數實現單片機與PC端的通信。關鍵字:51單片機;RS232接口;異步串行傳輸目錄前言2第一章 基本原理3第

2、二章 系統(tǒng)分析52.1 AT80C51單片機52.2 RS232接口標準52.3 單片機串行通信8第三章 系統(tǒng)設計及調試123.1 硬件部分123.2 軟件部分153.3 結果分析19設計總結21參考文獻22致 謝23附錄:源代碼24前言近年來,在自動化控制和智能儀器儀表中,單片機的應用越來越廣泛,由于單片機的運算功能較差,往往需要借助計算機系統(tǒng),因此單片機和PC機進行遠程通信更具有實際意義,通信的關鍵在于互傳數據信息。51系列單片機內部的串行口具有通信的功能,該串行口可以作為通信接口,利用該串行口與PC機的串行口進行串行通信,將單片機采集的數據傳送到PC機中,由PC機的高級語言或數據庫語言對

3、數據進行整理及統(tǒng)計等復雜處理就能滿足實際的應用需要。51單片機的開發(fā)除了硬件支持外,同樣離不開軟件。用匯編語言或C語言等高級語言編寫的源程序必須轉換為機器碼才能被執(zhí)行。目前十分流行的是Keil 8051 C編譯器。它提供了集成開發(fā)環(huán)境,包括C編譯器、宏匯編、連接器、庫管理和仿真調試器。利用Keil C uVision編寫的程序可直接調用編譯器編譯,連接后可直接燒至單片機上運行。在整個通信過程中,可以通過自己編寫的串口調試助手,實時地讀取串口的信息,并送相應的端口顯示。完成51單片機與PC機的串口通信。第一章 基本原理 一條信息的各位數據被依次順序傳送的通信方式成為串行通信。串行通信可以通過串口

4、實現通信。根據信息的傳送方向,串行通信可以進一步劃分為單工、半雙工和全雙工3種。信息只能單方向傳送為單工;信息能雙向傳送但不能同時傳送為半雙工;信息能夠同時雙向傳送則為全雙工。8051系列單片機有一個全雙工串行口,全雙工的串行通信只需要一根輸出線和輸入線。 RXD TXD 單 片 機 外 設 圖1.1 單片機與外設串口通信原理圖 串行通信又有異步通信和同步通信著兩種方式。同步通信是按照軟件識別同步字符來實現數據的發(fā)送和接收,異步通信是一種利用字符的再同步技術的通信方式。 異步通信實質是指甲乙通信雙方采用獨立的時鐘,每個數據均以起始位開始,停止位結束,起始位觸發(fā)甲乙雙方同步時鐘。每個異步串行幀中

5、的1位彼此嚴格同步,位周期同步。所謂異步是指發(fā)送、接收雙方的數據幀與幀之間不要求同步,也不必同步。 異步通信用起始位“0”表示字符的開始,然后從低位到高位依次傳送數據,最后用停止位“1”表示字符的結束。一個字符又稱作一幀信息,一幀信息包括一位起始位、8位信息位、1位停止位如圖1.2,若數據位增加至9位,在8051系列單片機中,第九位可以用作奇偶校驗位,也可以用作地址/數據幀標志如圖1.3。起始位 D0 D1 D2 D3 D4 D5 D6 D7停止位 圖1.2 幀信息(無奇偶校驗位)起始位D0D1D2D3D4D5D6D7D8停止位圖1.3 幀信息(含奇偶校驗位) 在同步通信中,每一數據塊開頭時發(fā)

6、送一個或兩個字符,使發(fā)送與接收雙方取得同步。數據塊的各個字符間取消了起始位和停止位,所以通信速度得以提高如圖1.4。同步通信時,如果發(fā)送的數據塊之間有間隔時間,則發(fā)送同步字符填充。圖 1.4 同步通信中同步字符填充 8051系列單片機串行I/O借口的工作原理就是:當要發(fā)送數據時,單片機自動將SBUF內的8位并行數據轉換為一定格式的串行數據,從TXD引腳按規(guī)定的波特率來輸出;當要接收數據時,要監(jiān)視RXD引腳,一旦出現起始位“0”,按規(guī)定的波特率將外圍設備送來的一定格式的串行數據轉換成8位并行數據,等待用戶讀取SBUF寄存器,若不及時讀取,SBUF中的數據有可能被刷新。8051系列單片機上有通用異

7、步接收/發(fā)送器(UART,UbiveralAsynchronous Receiver/Transimitter)用于串行通信,發(fā)送的數據有TXD引腳輸出,接收時從RXD引腳輸入,有兩個緩沖器(Serial Buffer),一個做發(fā)送緩沖器,另一個作為接收緩沖器。UART是可編程的全雙工(Full Duplex)的串行口。短距離的機間通信可以使用UART的TTL電平,使用驅動芯片(MAX232或1488/1489)可與通用微機進行通信。波特率時鐘必須從內部定時器1或者定時器2來產生。若在應用中實現R232所有的握手方式,則必須借助單片機其它引腳用軟件來處理。第二章 系統(tǒng)分析2.1 AT80C51

8、單片機 1 定時器/計時器 AT89C51單片機至少有16位內部定時器/計時器(T/C,Timer/Counter),提供了3個定時器。其中兩個基本定時器/計數器0(T/C0)和定時器/計數器1(T/C1),它們即可以編程為定時器使用,也可以編程為計數器使用,若是計數器內部晶振驅動時鐘,則是定時器;若是計數輸入引腳的脈沖信號,則它是計數器。 2 串行口 串行收/發(fā)存儲在特殊功能寄存器的SBUF(串行數據緩沖器),SBUF占用RAM地址為99H。實際上在單片機內部有兩個數據緩沖器;發(fā)送緩沖器和接收緩沖器,它們都以SBUF來命名,只根據對SBUF特殊功能寄存器讀/寫操作,單片機會自動切換發(fā)送緩沖器

9、或接收緩沖器。SBUF=0x01,該操作為寫操作,數值0x01會被裝載到發(fā)送緩沖器。TTmpmp=SBUF,該操作為讀操作,接收緩沖器的內容,接收緩沖器的內容會被賦值給變量。 3 中斷系統(tǒng)AT89C51單片機中斷系統(tǒng)的功能有5個中斷源,2個中斷優(yōu)先級,從而實現二級中斷嵌套,每一個中斷源的優(yōu)先級可有程序設定。與中斷系統(tǒng)工作有關的特殊功能寄存器有關的特殊功能寄存器有中斷允許控制寄存器IE、中斷優(yōu)先級控制寄存器IP以及定時器/計數器控制寄存器TCON等。2.2 RS232接口標準 RS-232C標準(協(xié)議)的全稱是EIA-RS-232C標準,定義是“數據終端設備(DTE)和數據通訊設備(DCE)之間

10、串行二進制數據接口技術標準”。它是在1970年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng)、調制解調器廠家及計算機終端生產廠家共同制定的用于串行通訊的標準。其中EIA代表美國電子工業(yè)協(xié)會,RS代表推薦標準,232是標識號,C代表RS232的最新一次修訂。 RS232接口引腳定義 由于RS-232并未定義連接器的物理特性,本課程設計使用的是DB-9類型的連接器,其引腳定義如下: 圖2.1 DB9引腳圖表2-1 RS引腳功能表舊制JIS名稱新制JIS名稱全 稱說 明FGSGFrame Ground連到機器的接地線TXDSDTransmitted Data數據輸出線RXDRDReceived Data數

11、據輸入線RTSRSRequest to Send要求發(fā)送數據CTSCSClear to Send回應對方發(fā)送的RTS的發(fā)送許可,告訴對方可以發(fā)送DSRDRData Set Ready告知本機在待命狀態(tài)DTRERData Terminal Ready告知數據終端處于待命狀態(tài)CDCDCarrier Detect載波檢出,用以確認是否收到Modem的載波SGSGSignal Ground信號線的接地線(嚴格的說是信號線的零標準線)RS232C規(guī)標準接口有25條線,4條數據線、11條控制線、3條定時線、7條備用和未定義線,常用的只有9根,它們是:(1) 狀態(tài)線數據準備就緒(Data set ready

12、-DSR)有效時(ON)狀態(tài),表明數據通信設備可以使用。(DCE->DTE).數據終端就緒(Data set ready-DTR)有效時(ON)狀態(tài),表明數據終端設備可以使用。(DTE>DCE)這兩個信號有時連在電腦上,上電就;立即有效。這兩個設備狀態(tài)信號有效,只表示設備本身可用,并不表示通信鏈路可以開始進行通信了,能否開始進行通信要由下面的控制信號決定。(2) 聯(lián)絡線請求發(fā)送(Request to send-RTS)DTE準備向DCE發(fā)送數據,DTE使該信號有效(ON狀態(tài)),通知DCE要發(fā)送數據給DCE了。(DTE->DCE)允許發(fā)送(CLear to send-CTS)是

13、對RTS的響應信號。當DCE已準備好接收DTE傳來的數據時,是該信號有效,通知DTE開始發(fā)送數據。(DCE->DTE)RTS/CTS請求應答聯(lián)絡信號是用于半雙工MODEM系統(tǒng)中發(fā)送方式和接收方式之間的切換。在全雙工系統(tǒng)中,因配置雙向通道,故不需要RTS/CTS聯(lián)絡信號,使其變高。(3) 數據線 發(fā)送數據(Transmitted data-TxD) DTE發(fā)送數據到DCE。(DTE->DCE) 接收數據(Received data-RxD)DCE發(fā)送數據到DTE。(DCE->DTE)(4)地線有兩根SG、PG:信號地和保護地信號線。(5) 其余 載波檢測(Carrier Det

14、ection-CD):用來表示DCE已接通通信鏈路,告知DTE準備接收數據。(DCE>DTE) 振鈴指示(Ring-RI):當DCE收到交換臺送來的振鈴呼叫信號時,使該信號有效(ON狀態(tài)),通知DTE,已被呼叫。(DCE>DTE) 通常的應用系統(tǒng)中,往往是CPU和I/O設備之間傳送信息,兩者都是DTE,比如PC和色溫計,PC和單片機之間的通信,雙方都能發(fā)送和接收,它們的連接只需要使用三根線即可,即RXD,TXD和GND。2.3 單片機串行通信串行通信方式傳輸數據只需要兩條數據線,更加經濟簡單,而且大大減少了數據傳輸過程中的串擾現象,更利于長距離通信。所以串行通信方式在近幾年得以快速

15、發(fā)展,在各種通信領域中發(fā)揮重要作用。51單片機的串行通信接口為RS-232接口,是一個全雙工異步串行接口(UART)(已在2.2中詳細介紹)。8051系列單片機的串行接口可以與PC機的COM接口進行通信,從而可以實現單片機的PC上位機控制。51單片機的串行數據輸入口為P3.0(RXD);串行數據輸出口為P3.1口(TXD)。 2.3.1 51單片機串行通信控制寄存器表2-2 51單片機串行端口控制寄存器SCON SCON(98H)位 7 6 5 4 3 2 1 0功能 SM0 SM1 SM2 REN TB8 RB8 T1 R1表2-3 SM0、SM1指定串口工作方式SM0SM1工作方式功能描述

16、波特率00方式08位移位寄存器/1201方式110位UART由定時器決定10方式211位UART/64或/3211方式311位UART由定時器決定SM2:多機通信控制位。主要用于方式2、3中;方式0不用此位應設此位為零; 方式1下此位也應設置為0,此時單片機只有接收到停止位后才置位RI位,并引發(fā)中斷;方式2、3中,當SM2清零后,串口以單片機方式發(fā)送或者接收數據,無論數據的第九位(RB8)為0還是1,都能夠使R1被激活,并引發(fā)中斷;方式2、3中,當SM2置位后,只有接收到的第九位數據(RB8)為1時才能置位RI,并引發(fā)中斷。當接收到的第九位數據為0時,不置位RI,接收到的數據丟失。REN:接收

17、允許控制位。由軟件控制,置位則開始接收數據,清零則停止接收數據。TB8:方式2、3時,本位為第九位傳送位,由軟件設置。RB8:接收到數據的第9位。方式0不能使用該位;方式1中,如果SM2=0,該位為接收到的停止位;方式2、3中,該位為接收到數據的第9位;T1:發(fā)送中斷標志位。當數據發(fā)送完成后該位置位,并引發(fā)中斷。該位有硬件置位,必須由軟件清零。RI:接收中斷標志位。當數據接收完成后該位置位,并引發(fā)中斷。該位由硬件置位,必須由軟件清零。表2-4 電源控制寄存器PCON PCON(87H)位 7 6 5 4 3 2 1 0功能SMOD - - - GF1 GF0 PD IDLSMOD:波特率加倍位

18、。當串口的波特率由T1產生時,該位置位則串口波特率提高一位。GF1:通用標志位。GF2:通用標志位。PD:此位置位后,單片機進入掉電模式,只能由硬件復位。IDL:此位置位后,單片機進入空閑模式。 2.3.2 串口工作模式解析1. 方式0 在方式0下,串口的SBUF為一個同步移位寄存器。發(fā)送數據時,數據由RxD引腳串行輸入/輸出,TxD發(fā)出移位脈沖。8位數據發(fā)送/接收時,低位在前,高位在后。發(fā)送/接收完一幀數據后,TI/RI由硬件置位,并在中斷允許的情況下向CPU請求中斷。2. 方式1 方式1為波特率可變的10為異步串行通信接口。10位數據包括一個起始位0,8個數據位,1個停止位。其傳輸的波特率

19、由T1的溢出率決定(波特率=T1溢出率)。 當TI=0時,8位數據可以送入SBUF寄存器中,TxD便將包括起始位和停止位的8位數據發(fā)送出去,發(fā)送完成后TI置位,如果在中斷允許的條件下,引發(fā)CPU中斷,提醒CPU數據發(fā)送已經完成。當RI=0,且REN=1時,串行口采樣RxD引腳,當采樣到1至0的跳變并確認為起始位后,就開始接收一幀數據。只有當RI=0且停止位為1(或者SM2=0)時,停止位才進入RB8,8位數據才進入接收寄存器,并由硬件置位中斷標志RI,否則信息丟失。所以,在方式1接收數據時,應該先用軟件清零RI和SM2標志。3. 方式2 方式2為固定波特率的11為UART方式,它僅比方式1增加

20、了一個可由軟件改變的第9位數據位。方式2發(fā)送數據時,數據由TxD端口輸出一幀11位信息,包括起始位,8位數據,由SCON寄存器TB8決定的第9位數據,停止位。當11位數據發(fā)送完成后,硬件置位TI位,如果允許中斷則引發(fā)中斷過程。當REN=1時,串口串行口采樣RxD引腳,當采樣到1至0的跳變并確認為起始位后,就開始接收一幀數據。當SM2=0時,無論接收到的第9位為1還是0,硬件都置位RI,并將接收到的8位數據送入SBUF寄存器。當SM2=1時,只有接收到的第9位數據位為1時才能引發(fā)硬件置位RI位,8位數據送入SBUF寄存器,第9位數據送入RB8。如果在中斷允許的情況下引發(fā)中斷。4. 方式3方式3為

21、波特率可變的11位UART方式。除波特率由定時器1的溢出率決定外,其他與方式2相同。 2.3.3 串口波特率計算 在方式1和方式3中,使用定時器1來產生波特率,由于串口定時要求比較嚴格,因此一般采用定時器1的可自動重裝的方式2進行計時。在定時器1方式2下,傳輸波特率計算公式為: (2-1)根據此式便可推導出在一定波特率下正確的定時器1初值。值得注意的是,當波特率加倍位開啟后,最終的波特率應該為上式數值的兩倍。2.3.4 串口初始化步驟 串口初始化過程一般為:(方式0、2不必設定T1,前4步可省去)1. T1工作方式確定(TMOD);2.TH1、TL1初值設定;3.啟動定時器1(TR1);4.設

22、定波特率加倍位;5.串口工作方式確定,允許接收(SCON);6.總中斷使能(不使用中斷方式可不啟動總中斷)。第三章 系統(tǒng)設計及調試 本部分包括硬件設計和軟件設計兩部分,硬件部分主要是實現單片機與PC機的雙向通信,軟件部分則是通過串口助手來調試PC端與單片機之間發(fā)送的具體信息。3.1 硬件部分此部分實現PC端與單片機端的雙向通信,PC端的電平是TTL,需要通過MAX232電平轉換電路來實現TTL電平與單片機的RS232電平之間的轉換。各組成電路如下圖:AT89C51的外圍電路MAX232電平轉換電路RS232接口電路異步串口通信電路 圖3.1 硬件電路組成圖 3.1.1 AT89C51及其外圍電

23、路 在系統(tǒng)設計中使用AT89C51單片機作為下位機與PC機進行串口通信。AT89C51是美國ATMEL公司生產的低電壓高性能的CMOS8位單片機片內置4Kbits的可反復擦寫的只讀程序存儲器PEROM和128bytes的隨機存儲器RAM器件采用ATMEL公司的高密度、非易失存儲技術生產兼容標準MCS-51指令系統(tǒng)片內置通用8位中央處理器CPU和Flash存儲單元功能強大。AT89C51包含中央處理器、程序存儲器(ROM)、數據存儲器(RAM)、定時/計數器、并行接口、串行接口和中斷系統(tǒng)等幾大單元及數據總線、地址總線和控制總線等三大總線。本設計中主要是利用AT89C51的異步通信UART模式原理

24、實現單片機與PC機之間的串口通信的。下圖是AT89C51及其外圍電路圖3.2 AT89C51及其外圍電路該電路可以實現單片機在固定的振蕩頻率上正常工作,以及更好的實現PC端與單片機的通信。3.1.2 電平轉換電路一般單片機的串口通信都需要通過MAX232進行電平轉換后進行數據通信的,當然AT89C51單片機也不例外,下圖是電平轉換電路,其中單片機的TXD與MAX232的R1OUT相連,單片機的RXD與MAX232的T1IN相連;T1OUT與RS232的RXD相連,R1IN與RS232的TXD相連。 由于RS232的邏輯“0”電平規(guī)定為+5V- +15V,邏輯“1”電平規(guī)定為-15V- -5V,

25、因此不能直接連接與TTL/CMOS電路連接,必須進行電平轉換。 電平轉換可以使用三極管等分離器件實現,也可采用專用的電平轉換芯片,MAX232就是其中典型的一種。MAX232不僅能夠實現電平的轉換,同時也實現了邏輯的相互轉換即正邏輯轉負邏輯。 圖3.3 MAX232電平轉換電路 下圖是整體硬件電路圖的設計,同過該圖可以實現從PC端發(fā)送數據,通過數碼管可以顯示PC端發(fā)送的信息;也可以通過按鍵,在通信界面顯示由單片機發(fā)來的信息。圖3.4 硬件部分電路3.2 軟件部分該部分需要通過在Windows XP系統(tǒng)下利用VSPD虛擬出兩個需要進行通信的COM端口號,利用keil編寫出單片機初始化以及與PC機

26、通信的程序,通過MATLAB的GUI編寫二者通信的串口界面,從而實現信息的串行異步傳輸。軟件部分流程圖如下:開始編寫程序利用VSPD虛擬一對進行通信的COM口利用MATLAB的GUI編寫的串口助手用于查看串口的信息給keil綁定COM2利用串口助手給相應端口發(fā)信息結束圖3.5 軟件部分流程圖 開始T1工作方式確定(TMOD)初值設定TH1、TL1啟動定時器1(TR1)設定波特率加倍位串口工作方式確定,允許接收(SCON) 總中斷使能(啟動)PC端向單片機發(fā)送數據單片機向PC端發(fā)送數據TI=1TI=1NNYYY結束置RI=0,單片機等待發(fā)送置TI=0,PC端等待發(fā)送圖3.6程序設計流程圖 單片機

27、程序設計的流程圖如上,通過對程序初始化,可以實現單片機與PC端的通信。通過置中斷標志位可以實現單片機對數據的讀寫操作。 具體的軟件操作流程如下所述: 首先,需要虛擬出進行通信的兩個串口,如下圖,圖中虛擬出通信的兩個端口COM1<->COM2口,并將keil綁定至COM2口,利用串口通信助手打開需要通信的COM1口,從而實現二者的通信。圖3.7 VSPD虛擬出的COM1、COM2口圖3.7 keil綁定COM2端口的界面 圖3.7中是給已編好的C文件添加*.INI為后綴的配置文件,文件內容為: MODE COM2 9600,0,8,1/keil綁定COM2,設置其波特率、校驗位、數據

28、位和停止位的參數ASSIGN COM2 <SIN> SOUT/設置keil的寄存器名為S,設定其輸入與輸出圖3.9 串口助手界面上圖是利用MATLAB的GUI設計的串口通信助手的界面,通過該界面可以讀取串口的信息,也可以向串口發(fā)送信息。圖3.10 PC端向單片機發(fā)送消息界面 上圖是由PC端向單片機發(fā)送消息的界面,在PC端發(fā)送一串字符可以在COM2口(單片機端)接收到,并在接收框顯示,表明實現了PC端向單片機端的通信。圖3.11 單片機向PC端發(fā)送信息的界面圖3.12 PC端接收單片機的信息界面 圖3.10是單片機向PC機發(fā)送信息的界面,通過發(fā)送可以在PC端的顯示界面上顯示(如圖3.

29、11所示)。表明實現了由單片機到PC端的通信。3.3 結果分析 硬件部分的電路仿真從原理上可以說明實現了單片機與PC機的雙向串行異步通信,代碼的編譯沒有問題,可能是硬件設計存在問題,最后的硬件仿真圖沒有實現預定的結果。 軟件部分的仿真可由上述圖3.10至3.12說明通過軟件可以實現PC端與單片機的雙向串行異步通信。但當發(fā)送的數據過于多,速度過快時,仿真出來的串口助手有時會突然關閉,以至于不能正確讀取信息,這也是軟件設計部分的局限所在,其余功能在XP系統(tǒng)上運行良好。設計總結本次課程設計歷時3周,在其中學到了很多新知識,也鍛煉了自己的動手能力和學習新知識的能力。認識到在老師的指引和幫助下以及同學之

30、間互相討論的過程中很多棘手的問題都可以解決,從中學到的不僅有學科知識,還有許多解決問題的能力。為此,需要不斷地積累基礎知識,試著自己獨立地解決一些問題。 在這次課程設計中,也感到自己在動手方面的欠缺,只是在現學現用,并沒有足夠的知識儲備,在用的時候馬上放到恰當的位置。另外,在理論方面還存在許多欠缺的地方,因此在設計代碼的過程中走了不少彎路。因此在今后的工作和學習中,要規(guī)劃好要做的事情,夯實理論基礎,實現高效工作。參考文獻1 張旭濤. 曾現峰. 單片機原理與應用. 北京:北京理工大學出版社.2006 2 穆蘭. 單片微型計算機原理及接口技術. 北京:機械工業(yè)出版社.2002 3 楊金巖. 鄭應強

31、. 51單片機數據傳輸接口擴展技術與應用實例. 北京:人民郵電出版社.2006 4 胡偉. 季曉衡. 單片機C程序設計及應用實例. 北京:人民郵電出版社.2006 5 黃智偉. 全國大學生電子設計競賽系統(tǒng)設計.北京:北京航空航天大學出版社. 2006 6 胡漢才組編. 單片機原理及接口技術. 北京:清華大學出版社,1996 致 謝 在本次課程設計中,首先要感謝我的同學們,在我遇到困難時,他們給了我很大的幫助。最重要的是要感謝彭老師的悉心支持與幫助,讓我少走了許多彎路,再次真的謝謝您,您給了我們很大的幫我們遇到困難時,您給我們耐心指導,不厭其煩地給我們演示??梢哉f沒有您的幫助,我們的設計將很難完

32、成,在此我要對您的諄諄教誨表示衷心的感謝!附錄:源代碼串口調試助手源代碼清單:function varargout = serial_communication2(varargin)gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, . 'gui_Singleton', gui_Singleton, . 'gui_OpeningFcn', serial_communication2_OpeningFcn, . 'gui_OutputFcn', serial_com

33、munication2_OutputFcn, . 'gui_LayoutFcn', , . 'gui_Callback', );if nargin && ischar(varargin1) gui_State.gui_Callback = str2func(varargin1);end if nargout varargout1:nargout = gui_mainfcn(gui_State, varargin:);else gui_mainfcn(gui_State, varargin:);endfunction serial_communic

34、ation2_OpeningFcn(hObject, eventdata, handles, varargin)handles.output = hObject;warning('off');javaFrame = get(hObject, 'JavaFrame');javaFrame.setFigureIcon(javax.swing.ImageIcon('icon.jpg');% 初始化參數hasData = false; %表征串口是否接收到數據isShow = false; %表征是否正在進行數據顯示,即是否正在執(zhí)行函數dataDispi

35、sStopDisp = false; %表征是否按下了【停止顯示】按鈕isHexDisp = false; %表征是否勾選了【十六進制顯示】isHexSend = false; %表征是否勾選了【十六進制發(fā)送】numRec = 0; %接收字符計數numSend = 0; %發(fā)送字符計數strRec = '' %已接收的字符串% 將上述參數作為應用數據,存入窗口對象內setappdata(hObject, 'hasData', hasData);setappdata(hObject, 'strRec', strRec);setappdata(hO

36、bject, 'numRec', numRec);setappdata(hObject, 'numSend', numSend);setappdata(hObject, 'isShow', isShow);setappdata(hObject, 'isStopDisp', isStopDisp);setappdata(hObject, 'isHexDisp', isHexDisp);setappdata(hObject, 'isHexSend', isHexSend);guidata(hObject

37、, handles);function varargout=serial_communication2_OutputFcn(hObject, eventdata, handles) varargout1 = handles.output;function com_Callback(hObject, , handles)function com_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUico

38、ntrolBackgroundColor') set(hObject,'BackgroundColor','white');endfunction rate_Callback(hObject, eventdata, handles) function rate_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor&#

39、39;) set(hObject,'BackgroundColor','white');endfunction jiaoyan_Callback(hObject, eventdata, handles)function jiaoyan_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor') set(hObject,

40、'BackgroundColor','white');endfunction data_bits_Callback(hObject, eventdata, handles)function data_bits_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor') set(hObject,'Backgrou

41、ndColor','white');end function stop_bits_Callback(hObject, eventdata, handles) function stop_bits_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor') set(hObject,'BackgroundColor'

42、;,'white');end function start_serial_Callback(hObject, eventdata, handles)% 【打開/關閉串口】按鈕的回調函數% 打開串口,并初始化相關參數 % 若按下【打開串口】按鈕,打開串口if get(hObject, 'value') % 獲取串口的端口名 com_n = sprintf('com%d', get(, 'value'); % 獲取波特率 rates = 300 600 1200 2400 4800 9600 19200 38400 43000 560

43、00 57600 115200; baud_rate = rates(get(handles.rate, 'value'); % 獲取校驗位設置 switch get(handles.jiaoyan, 'value') case 1 jiaoyan = 'none' case 2 jiaoyan = 'odd' case 3 jiaoyan = 'even' end % 獲取數據位個數 data_bits = 5 + get(handles.data_bits, 'value'); % 獲取停止位個

44、數 stop_bits = get(handles.stop_bits, 'value'); % 創(chuàng)建串口對象 scom = serial(com_n); % 配置串口屬性,指定其回調函數 set(scom, 'BaudRate', baud_rate, 'Parity', jiaoyan, 'DataBits',. data_bits, 'StopBits', stop_bits, 'BytesAvailableFcnCount', 10,. 'BytesAvailableFcnMode&

45、#39;, 'byte', 'BytesAvailableFcn', bytes, handles,. 'TimerPeriod', 0.05, 'timerfcn', dataDisp, handles); % 將串口對象的句柄作為用戶數據,存入窗口對象 set(handles.figure1, 'UserData', scom); % 嘗試打開串口 try fopen(scom); %打開串口 catch % 若串口打開失敗,提示“串口不可獲得!” msgbox('串口不可獲得!'); set(

46、hObject, 'value', 0); %彈起本按鈕 return; end % 打開串口后,允許串口發(fā)送數據,清空接收顯示區(qū),點亮串口狀態(tài)指示燈, % 并更改本按鈕文本為“關閉串口” set(handles.period_send, 'Enable', 'on'); %啟用【自動發(fā)送】按鈕 set(handles.manual_send, 'Enable', 'on'); %啟用【手動發(fā)送】按鈕 set(handles.xianshi, 'string', ''); %清空接收

47、顯示區(qū) set(handles.activex1, 'value', 1); %點亮串口狀態(tài)指示燈 set(hObject, 'String', '關閉串口'); %設置本按鈕文本為“關閉串口”else %若關閉串口 % 停止并刪除定時器 t = timerfind; if isempty(t) stop(t); delete(t); end % 停止并刪除串口對象 scoms = instrfind; stopasync(scoms); fclose(scoms); delete(scoms); % 禁用【自動發(fā)送】和【手動發(fā)送】按鈕,熄滅串口

48、狀態(tài)指示燈 set(handles.period_send, 'Enable', 'off', 'value', 0); %禁用【自動發(fā)送】按鈕 set(handles.manual_send, 'Enable', 'off'); %禁用【手動發(fā)送】按鈕 set(handles.activex1, 'value', 0); %熄滅串口狀態(tài)指示燈end function dataDisp(obj, event, handles)% 串口的TimerFcn回調函數% 串口數據顯示% 獲取參數hasDat

49、a = getappdata(handles.figure1, 'hasData'); %串口是否收到數據strRec = getappdata(handles.figure1, 'strRec'); %串口數據的字符串形式,定時顯示該數據numRec = getappdata(handles.figure1, 'numRec'); %串口接收到的數據個數% 若串口沒有接收到數據,先嘗試接收串口數據if hasData bytes(obj, event, handles);end% 若串口有數據,顯示串口數據if hasData % 給數據顯示模

50、塊加互斥鎖 % 在執(zhí)行顯示數據模塊時,不接受串口數據,即不執(zhí)行BytesAvailableFcn回調函數 setappdata(handles.figure1, 'isShow', true); % 若要顯示的字符串長度超過10000,清空顯示區(qū) if length(strRec) > 10000 strRec = '' setappdata(handles.figure1, 'strRec', strRec); end % 顯示數據 set(handles.xianshi, 'string', strRec); % 更新接

51、收計數 set(handles.rec,'string', numRec); % 更新hasData標志,表明串口數據已經顯示 setappdata(handles.figure1, 'hasData', false); % 給數據顯示模塊解鎖 setappdata(handles.figure1, 'isShow', false);end function bytes(obj, , handles)% 串口的BytesAvailableFcn回調函數% 串口接收數據% 獲取參數strRec = getappdata(handles.figure

52、1, 'strRec'); %獲取串口要顯示的數據numRec = getappdata(handles.figure1, 'numRec'); %獲取串口已接收數據的個數isStopDisp = getappdata(handles.figure1, 'isStopDisp'); %是否按下了【停止顯示】按鈕isHexDisp = getappdata(handles.figure1, 'isHexDisp'); %是否十六進制顯示isShow = getappdata(handles.figure1, 'isShow&

53、#39;); %是否正在執(zhí)行顯示數據操作% 若正在執(zhí)行數據顯示操作,暫不接收串口數據if isShow return;end% 獲取串口可獲取的數據個數n = get(obj, 'BytesAvailable');% 若串口有數據,接收所有數據if n % 更新hasData參數,表明串口有數據需要顯示 setappdata(handles.figure1, 'hasData', true); % 讀取串口數據 a = fread(obj, n, 'uchar'); % 若沒有停止顯示,將接收到的數據解算出來,準備顯示 if isStopDisp

54、 % 根據進制顯示的狀態(tài),解析數據為要顯示的字符串 if isHexDisp c = char(a'); else strHex = dec2hex(a')' strHex2 = strHex; blanks(size(a, 1); c = strHex2(:)' end % 更新已接收的數據個數 numRec = numRec + size(a, 1); % 更新要顯示的字符串 strRec = strRec c; end % 更新參數 setappdata(handles.figure1, 'numRec', numRec); %更新已接收的數據個數 setappdata(handles.figure1, 'strRec', strRec); %更新要顯示的字符串endfunction qingkong_Callback(hObject, eventdata, handles)% 清空要顯示的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論