UART0串口編程系列(二)

串口編程(UART0)之中斷方式編程

---------------------------------------------------------app

Author             :tiger-john
WebSite            :blog.csdn.net/tigerjb
函數

Email               jibo.tiger@gmail.com測試

Update-Time   : 2011123日星期日ui

Tiger聲明:本人鄙視直接複製本人文章而不加出處的我的或團體,但不排斥別人轉載tiger-john的文章,只是請您註明出處並和本人聯繫或留言給我3Qspa

---------------------------------------------------------.net

 

三.        中斷方式的串口編程指針

1.用中斷方式編寫串口程序由那幾部分組成orm

2.硬件上的支持blog

1>UART0 發送FIFO緩衝區

A.        UART0含有116字節的發送FIFO緩衝區

B.        U0THRUART0發送FIFO的最高字節

C.        UART的發送FIFO是一直使能的

2>UART0接收FIFO緩衝區

A.    UART0含有一個16字節的接收FIFO緩衝區。

B.    軟件設置接收FIFO緩衝區的觸發字節。

 

3>  中斷接口:UART0的中斷接口包含中斷使能寄存器(U0IER)和中斷標識寄存器(U0IIR)

l  U0IIR:提供狀態碼用於指示一個掛起中斷的中斷源和優先級。

l  U0IER能夠控制UART04箇中斷源。

4>  UART04箇中斷源:

A.    RLS(接收線狀態)中斷:

(1) 優先級最高

(2) 它在如下條件發生時產生錯誤

l  幀錯誤(FE

l  溢出錯誤(OE

l  奇偶錯誤(PE

l  間隔中斷(BI

注:

Ø  能夠經過查看U0LSR[4:1]中的值看到產生該中斷的錯誤條件

Ø  讀取U0LSR寄存器時清除該中斷。

B.    RDA(接收數據可用)中斷:

(1)CTI中斷並列第二優先級。

(2)在如下狀況觸發中斷:

l  當接收的有效數據到達接收FIFO設置寄存器(U0FCR)中設置的觸發點時,RDA被激活。當接收FIFO中的有效數據少於觸發點時,RDA復位。

l  中斷過程:

1>  移位寄存器(U0RSR)RxD引腳接收串行數據後,送入接收FIFO

2>  當接收FIFO中的有效數據數量達到預約的觸發點時,置位RDA中斷。

3>  U0RBR寄存器中讀取FIFO中最先到達的數據,當FIFO中的有效數據小於觸發點時,清零RDA中斷。

C.    CTI(字符超時指示)中斷

(1) 優先級爲2.

(2) 在如下狀況發生中斷:

l  當接收FIFO中的有效數據少於預約的觸發點數量時,若是在必定時間內仍沒有接收到新的數據,那將觸發該中斷。

(3) 上面的時間指的是:3.5~4.5個字節所須要的時間。

(4)  對接收FIFO的任何操做都會清零該中斷標誌。

(5) 中斷過程:

l  移位寄存器(U0RSR)RxD0引腳接收串行數據後,送入接收FIFO中。

l  當接收FIFO中的有效數據少於觸發個數,但若是長時間沒有數據到達,則觸發CTI中斷。

l  U0RBR中讀取接收FIFO中的數據,或者有新的數據送入接收FIFO,都將清零CTI中斷。

注:

Ø  3.5~4.5個字節的時間:指在串口當前的波特率下,發送3.5~4.5個字節所須要的時間。

Ø  當接收FIFO中存放多個數據,從U0RBR讀取數據,可是沒有讀完全部數據,那麼在通過3.5~4.5個字節的時間後觸發CTI中斷。

D.   THRE(發送)中斷

(1) 優先級爲第三級優先級。

(2) FIFO爲空而且在如下狀況觸發中斷:

l  系統啓動時,雖然發送FIFO爲空,但不會產生THRE中斷。

l  在上一次發生THRE中斷後,向發送FIFO中寫入1個字節數據,將在一個字節加上一個中止位後發生THRE中斷

(because:若是發送移位寄存器爲空,那麼寫入發送FIFO的數據將直接進入發送移位寄存器。此時發送FIFO仍然爲空,若是當即產生THRE中斷,就會影響緊接着寫入發送FIFO的數據。

因此在發送完該一個字節以及一箇中止位後,才產生THRE中斷。

l  若是在發送FIFO中有過兩個字節以上的數據,可是如今發送FIFO爲空時,將當即觸發THRE中斷。

l  THRE中斷爲當前有效的最高優先級中斷時,往U0THR寫數或者對U0IIR的讀操做,將使THRE中斷復位

 咱們來看看這些中斷源與存儲器之間的關係:

注:

Ø  由上圖可知:UART04箇中斷源:分別是RLS(線狀態)中斷,RDA(接收數據)中斷,CTI(字符超時)中斷,THRE(發送數據)中斷。

Ø  4箇中斷源的優先級以下圖所示:

3.串口中斷接收初始化

1>串口中斷接收初始化流程

l  設置I/O引腳鏈接到UART0

l  置位除數鎖存位,配置UART0幀數據格式

l  根據波特率計算分頻值

l  設置波特率

l  清除除數鎖存位,並設置工做模式

l  使能FIFO,並設置觸發點

l  容許RBR中斷

 

注:咱們能夠發現與輪訓方式相比,中斷方式只是增長了使能 FIFO, 並設置中斷觸發點和容許 RBR 中斷兩步。

2>中斷串口初始化須要配置的寄存器

     (與輪循方式配置方法相同的寄存器在此處不在涉及)

l  U0FCR(FIFO控制寄存器)U0FCR控制UART0 RxTx FIFO的操做。

l  U0IER(中斷使能寄存器)U0IER用於使能4UART0中斷源。

3>具體寄存器的配置

(1) U0FCR

A做用:控制UART0 RxTx的操做。

B長度:8位寄存器。

C:每一位的含義:

l  位:表示FIFO使能

1:表示使能對UART0 RxTx FIFO以及U0FCR[7:1]的訪問。

:表示不能使用RxTxFIFO以及步能對U0FCR[7:1]的訪問。

注:該位的任何變化都將使UART0 FIFO清空。

l  1位:表示Rx FIFO的復位。

1:會清零UART0 RxFIFO中的全部字節並復位指針邏輯。該位自動清零。

l  2位:表示Tx FIFO的復位。

1:會清零UART0 TxFIFO中的全部字節並復位指針邏輯。改位自動清零。

l  [5:3]位:保留位,用戶不能對其進行操做。從保留位讀出的值未被定義。

l  [7:6]位:表示Rx 觸發選擇

00:觸發點爲0(默認爲1字節)

01:觸發點爲1(默認爲4字節)

10:觸發點爲2(默認爲8字節)

11: 觸發點爲3(默認爲14字節)

注:這兩個位決定在激活中斷以前,接收UART0 FIFO必須寫入個字符。

(2) U0IER(中斷使能寄存器)

A 做用:U0IER用於使能4UART0中斷源

B 長度:8位寄存器

C每一位的含義:

l  位:表示RBR中斷使能

1:使能RDA中斷

:禁止RDA中斷

注:U0IEER 第零位使能UART0接收數據可用中斷。它還控制(CTI)字符接收超時中斷。

l  1位:表示THRE中斷使能

1:使能THRE中斷

:禁止THRE中斷

l  2位:表示Rx線狀態中斷使能

1:使能Rx線狀態中斷

:禁止RX線狀態中斷

注:U0IER第二位使能UART0 Rx線狀態中斷。該中斷的狀態可從U0LSR[4:1]讀出

l  [7:3]位:是保留位

:用戶不能向其寫入1.

4>串口初始化程序:

***********************************************************

* 做者:          tiger-john

* 時間:          2011118

* 名稱:                    UART0_Init

* 功能:                    UART0初始化 通信波特率1152008位數據位,      1位中止位,無奇偶校驗

*                               接收FIFO觸發點爲8字節,使能RDR(接收數據)中斷

* 入口參數:            bps           串口波特率

* 出口參數:           

****************************************************************************/

void      UART0_Init(uint32 bps)

{

 

    uint16  Fdiv;

    PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;  //設置UART0的引腳

    U0LCR = 0x83;                  //置爲除數鎖存位,進行配置

    Fdiv = (Fpclk>>4)/bps;

    U0DLM = Fdiv>>8;

    U0DLL = Fdiv%256;

    U0LCR = 0x03;            //清除除數鎖存位,並設置工做模式

    U0FCR = 0x81;           // 使能FIFO,並設置觸發點爲8字節

    U0IER = 0x01;           // 容許RBR中斷,即接收中斷

  

}

5.    中斷初始化

先來看一下UART0VIC之間的關係:

 

1>中斷初始化流程:

l  選擇中斷爲向量中斷或快速中斷

l  分配中斷通道

l  設置UART0向量地址

l  使能UART0中斷

2>關於ARM中斷編程方法和寄存器的使用在此不作涉及(若是想知道的話,能夠看這篇文章http://blog.csdn.net/tigerjb/archive/2010/11/30/6045409.aspx

3>中斷初始化程序:

/**********************************************************

* 做者:          tiger-john

* 時間:          2011118

* 名稱:                Interrupt_Init

* 功能:                初始化串口中斷,給串口中斷選擇爲向量中斷,     分配向量通道號1給串口                        

* 入口參數:          

* 出口參數:           

**********************************************************/

void Interrupt_Init (void)

{

   VICIntSelect = 0x00000000;      // 設置全部通道爲IRQ中斷    

   VICVectCntl1 = (0x20 | 6);   // UART0中斷通道分配到IRQ slot 1

   VICVectAddr1 = (uint32)UART0_Exception; // 設置UART0向量地址         

   VICIntEnable = 1 << 6;                      //使能串口中斷

   

           

}

6.    用中斷編寫接收函數

1>  中斷服務函數流程

l  清除串口中斷標識寄存器(U0IIR

l  清除中斷標誌

l  讀取接收FIFO中的數據

2>  中斷函數服務函數中須要配置的寄存器

(1) U0IIR中斷標識寄存器。

l  位:表示中斷掛起

1:表示沒有掛起的中斷

:表示至少有一箇中斷掛起

l  [3:1]位:中斷標識,這三位表示了對應UART0 Rx FIFO的中斷。

001:表示發送中斷(THRE)

010:  表示接收數據可用中斷(RDA)

011:  表示接收線狀態中斷(RLS)

110:  表示字符超時中斷(CTI)

l  [7:4]:是保留位

注:

1.    U0IIR提供的狀態碼可用於指示一個掛起中斷的中斷源和優先級。

2.    在訪問U0IIR過程當中,中斷被凍結

3.    若是在訪問U0IIR時,產生了中斷,該中斷被記錄。在下次訪問U0IIR時能夠讀出,避免中斷的丟失。

3>  中斷服務函數程序:

/******************************************************  * *     稱:IRQ_UART0()

*     能:串口UART0中斷接收8個字節的數據

* 入口參數:無

* 出口參數:無

**********************************************************/

uint8  rcv_buf[8];          // UART0數據接收緩衝區

 

void   __irq IRQ_UART0(void)

{   uint8  i;

    uint32 data;

    data = U0IIR;                 //清除中斷表示寄存器標誌

    VICVectAddr = 0;             //清除中斷

    for(i=0; i<8; i++)

    {

        rcv_buf[i] = U0RBR;      // 讀取FIFO的數據

    }

}  

 

7.    看一個總程序:

 

  1. /****************************************Copyright (c)************************************************** 
  2. **                                       西安郵電學院 
  3. **                                      graduate school 
  4. **                                       XNMS實驗室 
  5. **                                      Author:冀博 
  6. **                                      Time:2011年1月20日 
  7. **                                 http://blog.csdn.net/tigerjb 
  8. ** 
  9. **--------------File Info------------------------------------------------------------------------------- 
  10. ** File name:           UART0_while 
  11. ** Last modified Date:  2011-01-20 
  12. ** Last Version:        1.0 
  13. ** Descriptions:        經過上位機給串口發送8字節數據,ARM2200接收到串口數據後,把數據又發送回上位機 
  14. **------------------------------------------------------------------------------------------------------*/  
  15.   
  16. /********************************************************************************** 
  17. ** Modified by:         TIGER0-JOHN 
  18. ** Modified date:       2011-1-21 
  19. ** Version:             2.0   
  20. ** Descriptions:        測試成功 
  21.                         在用中斷的時候在Startup.S文件中的InitStack子程序中,修改設置 
  22.                         系統模式堆棧處的代碼爲"MSR CPSR_c,#0x5f" 
  23.                         測試成功 ,在上面上發送16進制數時,每一個之間用空格隔開 
  24.                         不加前綴 
  25. ********************************************************************************/  
  26.  
  27.  
  28. #include "config.h"  
  29. uint8 recver_buffer[8];      
  30. uint8 rcv_new;       
  31. /********************************************************** 
  32. * 名稱:       UART0_Init() 
  33. * 功能:       UART0初始化(通信波特率115200,8位數據位, 
  34.                 1位中止位,無奇偶校驗) 
  35. * 入口參數: bps     串口波特率 
  36. * 出口參數: 無 
  37. **********************************************************/  
  38. void  UART0_Init(uint32 bps)  
  39. {    
  40.     uint16 Fdiv;  
  41.     PINSEL0 = 0x00000005;               //設置串口引腳  
  42.     U0LCR = 0x83;                       //置爲除數鎖存位,進行配置  
  43.     Fdiv = (Fpclk >> 4) / bps;            // 設置波特率  
  44.     U0DLM = Fdiv >> 8;                              
  45.     U0DLL = Fdiv & 0xff;                          
  46.     U0LCR = 0x03;                      //清除除數鎖存位,並設置工做模式模式  
  47.     U0FCR = 0x81;                     // 使能FIFO,並設置觸發點爲8字節  
  48.     U0IER = 0x01;                     // 容許RBR中斷,即接收中斷  
  49.   
  50. }  
  51. /*********************************************************   
  52. * 名    稱:    IRQ_UART0 
  53. * 功    能:   串口UART0中斷接收8個字節的數據 
  54. * 入口參數: 無 
  55. * 出口參數: 無 
  56. **********************************************************/   
  57. void   __irq IRQ_UART0(void)  
  58. {   uint8  i;  
  59.     if( 0x04 == (U0IIR&0x0F) )   
  60.     {  
  61.      rcv_new = 1;   // 設置接收到新的數據標誌,並清除中斷標誌位  
  62.      for(i=0; i<8; i++)  
  63.         {  
  64.             recver_buffer[i] = U0RBR;       // 讀取FIFO的數據  
  65.         }  
  66.           VICVectAddr = 0;  
  67.      }                            //清除中斷  
  68. }    
  69. /********************************************************** 
  70. * 名稱:          Interrupt_Init 
  71. * 功能:          初始化串口中斷,給串口中斷選擇爲向量中斷, 
  72. *                 分配向量通道號1給串口                         
  73. * 入口參數:      無 
  74. * 出口參數:      無 
  75. **********************************************************/  
  76. void Interrupt_Init (void)  
  77. {  
  78.     VICIntSelect = 0x00000000;              // 設置全部通道爲IRQ中斷  
  79.     VICVectCntl0 = 0x26;                    // UART0中斷通道分配到IRQ slot 0,即優先級最高  
  80.     VICVectAddr0 = (int)IRQ_UART0;          // 設置UART0向量地址  
  81.     VICIntEnable = 0x00000040;              // 使能UART0中斷  
  82.                  
  83. }  
  84. /********************************************************** 
  85. * 名    稱:            UART0_SendByte 
  86. * 功    能:            向串口發送字節數據,並等待發送完畢。 
  87. * 入口參數:            data              要發送的數據 
  88. * 出口參數:            無 
  89. **********************************************************/  
  90. void   UART0_SendByte(uint8 data)  
  91. {  
  92.         U0THR = data;                   
  93.         while(0 == (U0LSR & 0x40));  
  94. }  
  95. /********************************************************** 
  96. * 名稱:       UART0_SendBuf() 
  97. * 功能:       經過串口發送一幀數據 
  98. * 入口參數: *buffer  存放一幀數據 
  99. * 出口參數: 無 
  100. **********************************************************/  
  101. void UART0_SendBuf(uint8 *buffer)  
  102. {  
  103.     uint8 *pbuffer;  
  104.     uint8 i;  
  105.     for(pbuffer = buffer,i = 0;i < 8; i++)  
  106.     UART0_SendByte(*(pbuffer++));  
  107. }  
  108.   
  109. /********************************************************** 
  110. * 名稱:       main()函數 
  111. * 功能:       上位機接收的數據開頭兩個字符爲0x10,0x11, 
  112. *               則原樣輸出,否次輸出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 
  113. * 入口參數: *buffer  存放一幀數據 
  114. * 出口參數: 無 
  115. **********************************************************/  
  116.   
  117. int main (void)  
  118. {   
  119.                                       
  120.     uint8 send_buffer[8] ={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};  //定義發送幀緩衝區  
  121.     UART0_Init(115200);  
  122.     Interrupt_Init();  
  123.     while(1)  
  124.         {  
  125.             if(1 == rcv_new)                    // 是否已經接收到8 Bytes的數據  
  126.                 {    
  127.                     rcv_new = 0;                    // 清除標誌  
  128.                     if(0x10 ==recver_buffer[0] && 0x11 == recver_buffer[1])  
  129.                         {  
  130.                             UART0_SendBuf(send_buffer);  
  131.                         }  
  132.                     else  
  133.                         {  
  134.                             UART0_SendBuf(recver_buffer);  
  135.                         }  
  136.                 }   
  137.         }          
  138.      return 0;  
  139. }  
  140. /********************************************************************************************************* 
  141. **                            End Of File 
  142. ********************************************************************************************************/  

.用中斷編寫發送函數

1.中斷初始化

同上和用中斷接收函數時的中斷初始化是同樣的

2.串口初始化

 1>串口初始化流程:

l  設置I/O引腳鏈接到UART0

l   置位除數鎖存位,配置UART0幀格式

l  根據波特率計算分頻值

l  設置波特率

l  清除除數鎖存位,並設置工做模式

l  使能FIFO,並使TxFIFO復位

l  使能THRE中斷

  2>串口初始化函數:

    /**********************************************************

* 名稱:                    UART0_Init

* 功能:                    UART0初始化 通信波特率1152008位數據位,1位中止位,無奇偶校驗

*                                  使能TxFIFO,THRE中斷

* 入口參數:            bps        串口波特率

* 出口參數:           

**********************************************************/

void      UART0_Init(uint32 bps)

{

 

    uint16  Fdiv;

    PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;  //設置UART0的引腳

    U0LCR = 0x83;         //置位除數鎖存位,配置UART0幀格式

    Fdiv = (Fpclk>>4)/bps;  //根據波特率計算分頻值

    U0DLM = Fdiv>>8;     //設置波特率

    U0DLL = Fdiv%256;

    U0LCR = 0x03;        // 清除除數鎖存位,並設置工做模式

    U0FCR = 0x05;       // 使能TxFIFO,並使TxFIFO復位

    U0IER = 0x02;       // 使能THRE中斷

  

}

3中斷服務函數:

  1>中斷服務函數流程:

l  清除串口中斷標識寄存器

l  清除中斷控制標識寄存器

  2>中斷髮送服務函數程序:

/**********************************************************

*     稱:            UART0_Exception

*     能:            串口發送中斷

* 入口參數:           

* 出口參數:            data              發送的數據

**********************************************************/

void   __irq IRQ_UART0(void)

{  

  

uint32 data;

data = U0IIR;                                                 //清除中斷表示寄存器標誌

VICVectAddr = 0;                                              //清除中斷

} 

4.   用串口中斷髮送函數的總程序:

  1. /****************************************Copyright (c)************************************************** 
  2. **                                       西安郵電學院 
  3. **                                      graduate school 
  4. **                                       XNMS實驗室 
  5. **                                      Author:冀博 
  6. **                                      Time:2011年1月20日 
  7. **                                 http://blog.csdn.net/tigerjb 
  8. ** 
  9. **--------------File Info------------------------------------------------------------------------------- 
  10. ** File name:           UART0_while 
  11. ** Last modified Date:  2011-01-20 
  12. ** Last Version:        1.0 
  13. ** Descriptions:        經過上位機給串口發送8字節數據,ARM2200接收到串口數據後,用中斷方式把數據又發送回上位機 
  14. **------------------------------------------------------------------------------------------------------*/  
  15.   
  16. /********************************************************************************** 
  17. ** Modified by:         TIGER0-JOHN 
  18. ** Modified date:       2011-1-21 
  19. ** Version:             2.0   
  20. ** Descriptions:        測試成功 
  21.                         在用中斷的時候在Startup.S文件中的InitStack子程序中,修改設置 
  22.                         系統模式堆棧處的代碼爲"MSR CPSR_c,#0x5f" 
  23.                         測試成功 ,在上面上發送16進制數時,每一個之間用空格隔開 
  24.                         不加前綴 
  25. ********************************************************************************/  
  26.  
  27.  
  28. #include "config.h"  
  29. uint8 recver_buffer[8];      
  30. uint8 rcv_new;       
  31. /**************************************************************************** 
  32. * 名稱:           UART0_Init 
  33. * 功能:           UART0初始化 通信波特率115200,8位數據位,1位中止位,無奇偶校驗 
  34. *                   使能TxFIFO,和THRE中斷 
  35. * 入口參數:     bps     串口波特率 
  36. * 出口參數:     無 
  37. ****************************************************************************/  
  38. void    UART0_Init(uint32 bps)  
  39. {  
  40.    
  41.     uint16  Fdiv;  
  42.     PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;        //設置UART0的引腳  
  43.     U0LCR = 0x83;                                //置位除數鎖存位,配置UART0幀格式  
  44.     Fdiv = (Fpclk>>4)/bps;                       //根據波特率計算分頻值  
  45.     U0DLM = Fdiv>>8;                            //設置波特率  
  46.     U0DLL = Fdiv%256;  
  47.     U0LCR = 0x03;                               //  清除除數鎖存位,並設置工做模式  
  48.     U0FCR = 0x05;                               // 使能TxFIFO,並使TxFIFO復位  
  49.     U0IER = 0x02;                               // 使能THRE中斷  
  50.      
  51. }  
  52. /**************************************************************************** 
  53. * 名    稱:       UART0_Exception 
  54. * 功    能:       串口發送中斷 
  55. * 入口參數:     無 
  56. * 出口參數:     data        發送的數據 
  57. ****************************************************************************/  
  58. void   __irq IRQ_UART0(void)  
  59. {     
  60.      
  61.     uint32 data;  
  62.     data = U0IIR;                                   //清除中斷表示寄存器標誌  
  63.     VICVectAddr = 0;                                //清除中斷  
  64.       
  65.     
  66. }    
  67. /********************************************************** 
  68. * 名稱:          Interrupt_Init 
  69. * 功能:          初始化串口中斷,給串口中斷選擇爲向量中斷, 
  70. *                 分配向量通道號1給串口                         
  71. * 入口參數:      無 
  72. * 出口參數:      無 
  73. **********************************************************/  
  74. void Interrupt_Init (void)  
  75. {  
  76.     VICIntSelect = 0x00000000;              // 設置全部通道爲IRQ中斷  
  77.     VICVectCntl0 = 0x26;                    // UART0中斷通道分配到IRQ slot 0,即優先級最高  
  78.     VICVectAddr0 = (int)IRQ_UART0;          // 設置UART0向量地址  
  79.     VICIntEnable = 0x00000040;              // 使能UART0中斷  
  80.                  
  81. }  
  82. /********************************************************** 
  83. * 名    稱:            UART0_RcvByte 
  84. * 功    能:            用查詢方式接收一字節的數據 
  85. * 入口參數:            無 
  86. * 出口參數:            data              要接收的數據 
  87. **********************************************************/  
  88. uint8   UART0_RcvByte(void)  
  89. {  
  90.     uint8 rcv_data ;  
  91.     while((U0LSR&0X01)==0);         //等待數據到達  
  92.     rcv_data = U0RBR;               //從U0RBR中讀出接收到的數據  
  93.     return  rcv_data;               //返回接收到的數據  
  94.   
  95. }  
  96. /********************************************************** 
  97. * 名稱:       UART0_RecBuf() 
  98. * 功能:       接收串口發送過來的幀數據,            
  99. * 入口參數: *buffer  存放一幀數據 
  100. * 出口參數: 無 
  101. **********************************************************/  
  102. void UART0_RecBuf (uint8 *buffer)  
  103. {  
  104.     uint8 *pbuffer;  
  105.     uint8  i;  
  106.     for(pbuffer = buffer, i = 0;i < 8; i++)  
  107.      {  
  108.         *(pbuffer++) = UART0_RcvByte();  
  109.      }  
  110. }  
  111. /********************************************************** 
  112. * 名稱:       main()函數 
  113. * 功能:       上位機接收的數據開頭兩個字符爲0x10,0x11, 
  114. *               則原樣輸出,否次輸出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 
  115. * 入口參數: *buffer  存放一幀數據 
  116. * 出口參數: 無 
  117. **********************************************************/  
  118.   
  119. int main (void)  
  120. {   
  121.     uint8 i;                                  
  122.     uint8 send_buffer[8] ={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};  //定義發送幀緩衝區  
  123.     UART0_Init(115200);  
  124.     Interrupt_Init();  
  125.     while(1)  
  126.         {  
  127.             UART0_RecBuf(recver_buffer);                //接收8字節數據  
  128.             if(0x10 ==recver_buffer[0] && 0x11 == recver_buffer[1])  
  129.                 {   
  130.                     for(i = 0;i < 8 ;i++)  
  131.                     {  
  132.                         U0THR = send_buffer[i];         //用中斷髮送每次8字節  
  133.                     }     
  134.                 }  
  135.             else  
  136.                 {  
  137.                     for(i = 0;i < 8;i++)                //用中斷髮送每次8字節  
  138.                     {  
  139.                         U0THR = recver_buffer[i];  
  140.                     }  
  141.                 }   
  142.         }          
  143.      return 0;  
  144. }  
  145. /********************************************************************************************************* 
  146. **                            End Of File 
  147. ********************************************************************************************************/
相關文章
相關標籤/搜索