串口中斷發送與接收_第1頁
串口中斷發送與接收_第2頁
串口中斷發送與接收_第3頁
串口中斷發送與接收_第4頁
串口中斷發送與接收_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、串口中斷接收與發送以前一直寫串II程序都是發送一個字符,然后等待TI=1時再發另一個字符,覺得這樣很浪 費時間,因為在波特率為9600時,每發一個字符差不多要1ms的時間:接收則接收一個字 符即存入數組,直到有結束標志出現,后來發現這種做法很局限,因為在與一些串II設備通 訊時,返回的數據很雅以最后一個字符為結束標志符。于是現在重新變換了一下串口發送(接收)的思路:發送:中斷只管發送,程序把要發送的數組寫入緩存然后觸發發送信號,剩下的則由中斷處 理,當識別到結束標志時,發送完畢,及置位發送完畢標志。接收:中斷只管接收并存入緩存,程序每循環一次則檢測一次緩存是否有數據變化,若有則 讀緩存,若無則

2、跳過。在讀完最后一個緩存字符之后若n (設n=100)次循環檢測緩存再無 變化,則認為一組數據發送完畢。程序流程圖如下所示:讀取緩存計數復位計數減1接收完畢數據處理其他程序于是寫了如下程序。,* *:$:*;$:*:$:*:$:* * *:*串I中斷接收(發送)數據單片機接收完一組數據后將其再從串11發回串I測試直接可運行#iiiclude#inc lude#mclude#define uchai unsigned char#define umt unsigned mtsbit Rxd=PlA0;sbit Txd=PlAl;接收腳(模擬串I I)發送腳0 x010 x020 x030 x040

3、 x05#define RSTdefine NEW#define CMGR#define BEGINdefine STOP#define NEXT 0 x06#define NEXTBEGIN 0 x07#define START#define TRUE#define FALSE0 x080 x090 x0a新短信標志讀短信標志儀表數據開始讀儀表數據結束讀/準備讀短信內容開始讀短信開始讀發送短信的手機號碼準備讀號碼,也作為新短信讀取后的標志沒有新短信數據存儲數據長度標志發送狀態標志讀取串11數據記錄的位置(書簽)/讀串I標志計數250void iniCsenallQ;void send_lis

4、ttable(ucharvoid receive_listtable();uchai xdata table_send140;發送緩存uchai SendLength=O;uchai xdata table_receive32;接收緩存uchai ReceiveLength=O;uchai xdata table_dat 100=MHello world ?nM;uchai DatLength=O;uchai SendFlag=O;uchai ReadMaik=0;uchai ReadFlag;umt EndFlag=250:串I I初始化為方式1:9600,n,8,1串I發送一個字符串串I緩

5、存接收主程序umtj=1000;while(j-);開啟程序時先等待一會(一直還沒明白為什串I I初始化先試發一串數據么要這樣,不然下完程序后第一次發送出錯)init_seiiall();send_listtable(table_dat);while(l)receiveJisttableQ;if(ReadFlag=STOP)讀緩存讀取完一組數據ReadFlag=RST;sendjisttable(table_dat);將讀取的數據發回串I 1(調試用)void init_senallQSendFlag=STOP;ReadFlag=RST;TMOD|=0X20;TH1=OXFD;TL1=OXFD

6、:SM0=0;開啟串I I收發設置波特率9600SM1=1;REN=1;RI=0;TI=0;TR1=1;ES=1;EA=1;方式1, 10位異步收發數據接收允許void send_listtable(uchar *list) 并觸發發送uchar lislength=O;iRSendFlagSTOP)do串I I發送程序,將list數據存入緩存,數據發送完標志table_sendlislength=listlislength;)while(listlislength+?=,n,);/結束標志SendFlag=BEGIN;發送開始標志,且標志著發送沒有結束TI=1;)void receive_l

7、isttable()讀取串口緩存數據/DatLength=O;while(ReadMark!=ReceiveLength)進入若緩存數據發生變化,則table_datDatLength=table_receiveReadMaik; 將緩存數據讀出 table_datDatLength+ DatLengtli+;ReadMaik=+ReadMark&Ox 1 f;EndFlag=100;ReadFlag=BEGIN;ifReadFlag=BEGIN)讀位置標記計數復位形如讀了if(EndFlag=O)掃描100次若緩存未再有在收到最后一個字符后數據輸入,則認為本段數據傳輸完畢DatLength=O:ReadFlag=STOP;一組數據讀取結束) elseEndFlag-;計數減1void serial IQ mtemipt 4串I 1數據讀完(寫完)1個數據后中斷讀串IRI=0;table_receiveReceiveLength=SBUF;緩存16位,循環存入ReceiveLengtli=+ReceiveLength&Ox 1 f;)else if(table_send

溫馨提示

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

評論

0/150

提交評論