找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3450|回复: 0
打印 上一主题 下一主题
收起左侧

MSP430单片机UART定长帧与变长帧处理程序

[复制链接]
跳转到指定楼层
楼主
ID:108615 发表于 2016-3-14 19:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件 (例2.9.13)))完整例程下载:http://www.51hei.com/bbs/dpj-46245-1.html

关于本程序的详细解说大家可以下载电子书点击上图即可
MSP430单片机UART定长帧处理程序:
  1. #include <msp430x42x.h>
  2. #define FRAME_SIZE  8                              /*定长帧的长度*/
  3. #define LOCAL_ADDR  0x01
  4. unsigned char FrameBuff[FRAME_SIZE];          /*接收帧缓冲区数组*/
  5. unsigned int  UART_RcvCnt=0;                /*接收计数*/
  6. unsigned char FrameRcvStatus=0;         /*帧接收状态*/
  7. #define FREE     0
  8. #define RECEIVE  1

  9. #pragma vector=UART0RX_VECTOR
  10. __interrupt void UART0_RX (void)         // 串口接收中断
  11. {
  12.    if(FrameRcvStatus==FREE)             // 空闲状态下
  13.    {
  14.      if((U0RCTL & RXWAKE) &&(U0RXBUF==LOCAL_ADDR))   
  15.      {                                //如果收到的是帧首字节,且与本机地址相符
  16.          FrameBuff[0]=U0RXBUF;        //接收该字节
  17.          FrameRcvStatus=RECEIVE;      //状态跳转至接收状态
  18.          UART_RcvCnt=1;               //接收计数(已经接收1字节)
  19.      }
  20.    }
  21.    else if(FrameRcvStatus==RECEIVE)     // 在接收状态下
  22.    {
  23.       if((U0RCTL & RXWAKE)==0)            //如果收到的是数据
  24.       {
  25.         FrameBuff[UART_RcvCnt]=U0RXBUF; //接收该字节数据
  26.         UART_RcvCnt++;                  //指向下一单元
  27.       }
  28.       else                              //如果又收到是帧首字节(数据帧中断或漏发)
  29.       {
  30.         if(U0RXBUF==LOCAL_ADDR)         //且地址相符
  31.         {
  32.           FrameBuff[0]=U0RXBUF;         //接收该字节数据
  33.           UART_RcvCnt=1;                //重新接收数据
  34.         }
  35.         else                            //地址不符
  36.         {
  37.           UART_RcvCnt=0;                //接收数组清零
  38.           FrameRcvStatus=FREE;          //重新回到空闲状态,等待帧起始
  39.         }
  40.       }
  41.       if(UART_RcvCnt>=FRAME_SIZE )
  42.       {
  43. //--------------------------------------------------------------------------
  44. //                  数据帧接收完毕,在这里写数据帧处理程序
  45.           _NOP();  //在这里设断点查看FrameBuff[]数组的数据
  46. //--------------------------------------------------------------------------        
  47.           UART_RcvCnt=0;                //接收数组清零
  48.           FrameRcvStatus=FREE;          //重新回到空闲状态,等待帧起始        
  49.       }
  50.    }
  51. }

  52. void main( void )
  53. {                                                               
  54.   WDTCTL = WDTPW + WDTHOLD;                   // 停止看门狗
  55.   FLL_CTL0 |= XCAP18PF;                        // 配置晶振负载电容
  56.   U0CTL = CHAR;                                // 异步通讯模式,8位数据,无校验,1位停止位。
  57.   ME1 |= UTXE0 + URXE0;                        // 开启串口0收发模块
  58.   U0TCTL |= SSEL0;                        // 选择ACLK作为串口波特率时钟源。
  59.   U0BR1 = 0;                                //
  60.   U0BR0 = 13;                                // 分频系数整数部分=13
  61.   U0MCTL = 0x6B;                        // 分频系数小数部分调制=5/8。(2400bps)
  62.   P2SEL |= BIT4 + BIT5;  // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
  63.   IE1 |= URXIE0;                         // 开启UART0的接收中断,在中断内接收数据
  64.   _EINT();                                // 总中断允许
  65.   while(1)
  66.   {   
  67.     //CPU可以执行其他任务
  68.   }
  69. }
复制代码

MSP430单片机UART变长帧处理程序:
  1. #include <msp430x42x.h>
  2. #define FRAMEBUF_SIZE  32                /*最大帧长度*/
  3. unsigned char FrameBuff[FRAMEBUF_SIZE]; /*接收帧缓冲区数组*/
  4. unsigned int  UART_RcvCnt=0;                /*接收计数*/

  5. #pragma vector=UART0RX_VECTOR
  6. __interrupt void UART0_RX (void)         // 串口接收中断
  7. {
  8.   int i;
  9.   if(U0RXBUF==0x0D) return;             //对回车命令的第一字节不响应
  10.   if(U0RXBUF==0x0A)                     //收到结束符
  11.     {
  12. //--------------------------------------------------------------------------
  13. // 数据帧接收完毕,在这里写数据帧处理程序,注意缓冲区只用前UART_RcvCnt个数据
  14.        _NOP();  //在这里设断点查看FrameBuff[]数组的数据
  15. //--------------------------------------------------------------------------        
  16.       UART_RcvCnt=0;                    //清除接收缓冲区字节数清零
  17.       for(i=0;i<FRAMEBUF_SIZE;i++) FrameBuff[i]=0; //清除接收缓冲区(可省略)
  18.       return;
  19.     }
  20.    if(UART_RcvCnt<FRAMEBUF_SIZE)        //正常数据,若缓冲区未满
  21.     {
  22.       FrameBuff[UART_RcvCnt]=U0RXBUF;    //接收一字节数据
  23.       UART_RcvCnt++;                     //指向下一字节
  24.     }
  25. }

  26. void main( void )
  27. {                                                               
  28.   WDTCTL = WDTPW + WDTHOLD;                   // 停止看门狗
  29.   FLL_CTL0 |= XCAP18PF;                        // 配置晶振负载电容
  30.   U0CTL = CHAR;                                // 异步通讯模式,8位数据,无校验,1位停止位。
  31.   ME1 |= UTXE0 + URXE0;                        // 开启串口0收发模块
  32.   U0TCTL |= SSEL0;                        // 选择ACLK作为串口波特率时钟源。
  33.   U0BR1 = 0;                                //
  34.   U0BR0 = 13;                                // 分频系数整数部分=13
  35.   U0MCTL = 0x6B;                        // 分频系数小数部分调制=5/8。(2400bps)
  36.   P2SEL |= BIT4 + BIT5;  // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
  37.   IE1 |= URXIE0;                         // 开启UART0的接收中断,在中断内接收数据
  38.   _EINT();                                // 总中断允许
  39.   while(1)
  40.   {   
  41.     //CPU可以执行其他任务
  42.   }
  43. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表