2009|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

分享MSP430单片机UART定长帧与变长帧处理程序 [复制链接]

MSP430单片机UART定长帧与变长帧处理程序
MSP430单片机UART定长帧处理程序:
#include
#define FRAME_SIZE  8                              /*定长帧的长度*/
#define LOCAL_ADDR  0x01
unsigned char FrameBuff[FRAME_SIZE];          /*接收帧缓冲区数组*/
unsigned int  UART_RcvCnt=0;                /*接收计数*/
unsigned char FrameRcvStatus=0;         /*帧接收状态*/
#define FREE     0
#define RECEIVE  1

#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void)         // 串口接收中断
{
   if(FrameRcvStatus==FREE)             // 空闲状态下
   {
     if((U0RCTL & RXWAKE) &&(U0RXBUF==LOCAL_ADDR))   
     {                                //如果收到的是帧首字节,且与本机地址相符
         FrameBuff[0]=U0RXBUF;        //接收该字节
         FrameRcvStatus=RECEIVE;      //状态跳转至接收状态
         UART_RcvCnt=1;               //接收计数(已经接收1字节)
     }
   }
   else if(FrameRcvStatus==RECEIVE)     // 在接收状态下
   {
      if((U0RCTL & RXWAKE)==0)            //如果收到的是数据
      {
        FrameBuff[UART_RcvCnt]=U0RXBUF; //接收该字节数据
        UART_RcvCnt++;                  //指向下一单元
      }
      else                              //如果又收到是帧首字节(数据帧中断或漏发)
      {
        if(U0RXBUF==LOCAL_ADDR)         //且地址相符
        {
          FrameBuff[0]=U0RXBUF;         //接收该字节数据
          UART_RcvCnt=1;                //重新接收数据
        }
        else                            //地址不符
        {
          UART_RcvCnt=0;                //接收数组清零
          FrameRcvStatus=FREE;          //重新回到空闲状态,等待帧起始
        }
      }
      if(UART_RcvCnt>=FRAME_SIZE )
      {
//--------------------------------------------------------------------------
//                  数据帧接收完毕,在这里写数据帧处理程序
          _NOP();  //在这里设断点查看FrameBuff[]数组的数据
//--------------------------------------------------------------------------        
          UART_RcvCnt=0;                //接收数组清零
          FrameRcvStatus=FREE;          //重新回到空闲状态,等待帧起始        
      }
   }
}

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

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

#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void)         // 串口接收中断
{
  int i;
  if(U0RXBUF==0x0D) return;             //对回车命令的第一字节不响应
  if(U0RXBUF==0x0A)                     //收到结束符
    {
//--------------------------------------------------------------------------
// 数据帧接收完毕,在这里写数据帧处理程序,注意缓冲区只用前UART_RcvCnt个数据
       _NOP();  //在这里设断点查看FrameBuff[]数组的数据
//--------------------------------------------------------------------------        
      UART_RcvCnt=0;                    //清除接收缓冲区字节数清零
      for(i=0;i=0; //清除接收缓冲区(可省略)
      return;
    }
   if(UART_RcvCnt     {
      FrameBuff[UART_RcvCnt]=U0RXBUF;    //接收一字节数据
      UART_RcvCnt++;                     //指向下一字节
    }
}

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

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 11

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表