找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 4145|回復: 0
打印 上一主題 下一主題
收起左側(cè)

MSP430單片機UART定長幀與變長幀處理程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:108615 發(fā)表于 2016-3-14 19:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本程序是《MSP430系列單片機系統(tǒng)工程設(shè)計與實踐》書里面的源碼,(包含工程文件 (例2.9.13)))完整例程下載:http://www.torrancerestoration.com/bbs/dpj-46245-1.html

關(guān)于本程序的詳細解說大家可以下載電子書點擊上圖即可
MSP430單片機UART定長幀處理程序:
  1. #include <msp430x42x.h>
  2. #define FRAME_SIZE  8                              /*定長幀的長度*/
  3. #define LOCAL_ADDR  0x01
  4. unsigned char FrameBuff[FRAME_SIZE];          /*接收幀緩沖區(qū)數(shù)組*/
  5. unsigned int  UART_RcvCnt=0;                /*接收計數(shù)*/
  6. unsigned char FrameRcvStatus=0;         /*幀接收狀態(tài)*/
  7. #define FREE     0
  8. #define RECEIVE  1

  9. #pragma vector=UART0RX_VECTOR
  10. __interrupt void UART0_RX (void)         // 串口接收中斷
  11. {
  12.    if(FrameRcvStatus==FREE)             // 空閑狀態(tài)下
  13.    {
  14.      if((U0RCTL & RXWAKE) &&(U0RXBUF==LOCAL_ADDR))   
  15.      {                                //如果收到的是幀首字節(jié),且與本機地址相符
  16.          FrameBuff[0]=U0RXBUF;        //接收該字節(jié)
  17.          FrameRcvStatus=RECEIVE;      //狀態(tài)跳轉(zhuǎn)至接收狀態(tài)
  18.          UART_RcvCnt=1;               //接收計數(shù)(已經(jīng)接收1字節(jié))
  19.      }
  20.    }
  21.    else if(FrameRcvStatus==RECEIVE)     // 在接收狀態(tài)下
  22.    {
  23.       if((U0RCTL & RXWAKE)==0)            //如果收到的是數(shù)據(jù)
  24.       {
  25.         FrameBuff[UART_RcvCnt]=U0RXBUF; //接收該字節(jié)數(shù)據(jù)
  26.         UART_RcvCnt++;                  //指向下一單元
  27.       }
  28.       else                              //如果又收到是幀首字節(jié)(數(shù)據(jù)幀中斷或漏發(fā))
  29.       {
  30.         if(U0RXBUF==LOCAL_ADDR)         //且地址相符
  31.         {
  32.           FrameBuff[0]=U0RXBUF;         //接收該字節(jié)數(shù)據(jù)
  33.           UART_RcvCnt=1;                //重新接收數(shù)據(jù)
  34.         }
  35.         else                            //地址不符
  36.         {
  37.           UART_RcvCnt=0;                //接收數(shù)組清零
  38.           FrameRcvStatus=FREE;          //重新回到空閑狀態(tài),等待幀起始
  39.         }
  40.       }
  41.       if(UART_RcvCnt>=FRAME_SIZE )
  42.       {
  43. //--------------------------------------------------------------------------
  44. //                  數(shù)據(jù)幀接收完畢,在這里寫數(shù)據(jù)幀處理程序
  45.           _NOP();  //在這里設(shè)斷點查看FrameBuff[]數(shù)組的數(shù)據(jù)
  46. //--------------------------------------------------------------------------        
  47.           UART_RcvCnt=0;                //接收數(shù)組清零
  48.           FrameRcvStatus=FREE;          //重新回到空閑狀態(tài),等待幀起始        
  49.       }
  50.    }
  51. }

  52. void main( void )
  53. {                                                               
  54.   WDTCTL = WDTPW + WDTHOLD;                   // 停止看門狗
  55.   FLL_CTL0 |= XCAP18PF;                        // 配置晶振負載電容
  56.   U0CTL = CHAR;                                // 異步通訊模式,8位數(shù)據(jù),無校驗,1位停止位。
  57.   ME1 |= UTXE0 + URXE0;                        // 開啟串口0收發(fā)模塊
  58.   U0TCTL |= SSEL0;                        // 選擇ACLK作為串口波特率時鐘源。
  59.   U0BR1 = 0;                                //
  60.   U0BR0 = 13;                                // 分頻系數(shù)整數(shù)部分=13
  61.   U0MCTL = 0x6B;                        // 分頻系數(shù)小數(shù)部分調(diào)制=5/8。(2400bps)
  62.   P2SEL |= BIT4 + BIT5;  // P2.4,5 開啟第二功能,作為串口收發(fā)引腳(不同單片機有差別)
  63.   IE1 |= URXIE0;                         // 開啟UART0的接收中斷,在中斷內(nèi)接收數(shù)據(jù)
  64.   _EINT();                                // 總中斷允許
  65.   while(1)
  66.   {   
  67.     //CPU可以執(zhí)行其他任務
  68.   }
  69. }
復制代碼

MSP430單片機UART變長幀處理程序:
  1. #include <msp430x42x.h>
  2. #define FRAMEBUF_SIZE  32                /*最大幀長度*/
  3. unsigned char FrameBuff[FRAMEBUF_SIZE]; /*接收幀緩沖區(qū)數(shù)組*/
  4. unsigned int  UART_RcvCnt=0;                /*接收計數(shù)*/

  5. #pragma vector=UART0RX_VECTOR
  6. __interrupt void UART0_RX (void)         // 串口接收中斷
  7. {
  8.   int i;
  9.   if(U0RXBUF==0x0D) return;             //對回車命令的第一字節(jié)不響應
  10.   if(U0RXBUF==0x0A)                     //收到結(jié)束符
  11.     {
  12. //--------------------------------------------------------------------------
  13. // 數(shù)據(jù)幀接收完畢,在這里寫數(shù)據(jù)幀處理程序,注意緩沖區(qū)只用前UART_RcvCnt個數(shù)據(jù)
  14.        _NOP();  //在這里設(shè)斷點查看FrameBuff[]數(shù)組的數(shù)據(jù)
  15. //--------------------------------------------------------------------------        
  16.       UART_RcvCnt=0;                    //清除接收緩沖區(qū)字節(jié)數(shù)清零
  17.       for(i=0;i<FRAMEBUF_SIZE;i++) FrameBuff[i]=0; //清除接收緩沖區(qū)(可省略)
  18.       return;
  19.     }
  20.    if(UART_RcvCnt<FRAMEBUF_SIZE)        //正常數(shù)據(jù),若緩沖區(qū)未滿
  21.     {
  22.       FrameBuff[UART_RcvCnt]=U0RXBUF;    //接收一字節(jié)數(shù)據(jù)
  23.       UART_RcvCnt++;                     //指向下一字節(jié)
  24.     }
  25. }

  26. void main( void )
  27. {                                                               
  28.   WDTCTL = WDTPW + WDTHOLD;                   // 停止看門狗
  29.   FLL_CTL0 |= XCAP18PF;                        // 配置晶振負載電容
  30.   U0CTL = CHAR;                                // 異步通訊模式,8位數(shù)據(jù),無校驗,1位停止位。
  31.   ME1 |= UTXE0 + URXE0;                        // 開啟串口0收發(fā)模塊
  32.   U0TCTL |= SSEL0;                        // 選擇ACLK作為串口波特率時鐘源。
  33.   U0BR1 = 0;                                //
  34.   U0BR0 = 13;                                // 分頻系數(shù)整數(shù)部分=13
  35.   U0MCTL = 0x6B;                        // 分頻系數(shù)小數(shù)部分調(diào)制=5/8。(2400bps)
  36.   P2SEL |= BIT4 + BIT5;  // P2.4,5 開啟第二功能,作為串口收發(fā)引腳(不同單片機有差別)
  37.   IE1 |= URXIE0;                         // 開啟UART0的接收中斷,在中斷內(nèi)接收數(shù)據(jù)
  38.   _EINT();                                // 總中斷允許
  39.   while(1)
  40.   {   
  41.     //CPU可以執(zhí)行其他任務
  42.   }
  43. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表