[资料分享] 学习MSP430十六进制数据后回传至PC机

Aguilera   2017-8-22 23:13 楼主
******************************************************
程序功能:接收PC机十六进制数据后回传至PC机
数据格式:十六进制

帧头:FD

帧尾: FE


*******************************************************/
#include


unsigned char RecBuf[255]; //接收数据缓存
unsigned char *SDat;     //指向要发送的数据
unsigned char Rindex;      //接收数据计数
unsigned char Tindex;      //发送数据计数
unsigned char SendLen;     //发送数据长度


/*************************************************
函数名称:ConfigUart0
功    能:配置UART0,使用SMCLK,N.8.1, 9600
          无校验,8个数据位,1个停止位,波特率9600
参    数:无
返回值 :无
**************************************************/
void ConfigUart0()
{
    P3SEL |= 0x30;                            // 选择P3.4和P3.5做UART通信端口
    ME1 |= UTXE0 + URXE0;                     // 使能USART0的发送和接受
    UCTL0 |= CHAR;                            // 选择8位字符

    UTCTL0 |= SSEL1;                          // UCLK = SMCLK
    UBR00 = 0xD0;                             // 波特率9600
    UBR10 = 0x00;                             //
    UMCTL0 = 0x40;                            // Modulation
    UCTL0 &= ~SWRST;                          // 初始化UART状态机
    IE1 |= URXIE0 + UTXIE0;                   // 使能USART0的收发中断   
}

/********************主函数********************/
void main(void)
{
    unsigned int i;

    WDTCTL = WDTPW + WDTHOLD;     // 关闭看门狗
    BCSCTL1 &= ~XT2OFF;           //使TX2有效,TX2上电默认是关闭的
    do
    {
      IFG1 &= ~OFIFG;             //清除振荡器失效标志
      for(i=0xff;i>0;i--);        //延时,待稳定
    }
    while((IFG1 & OFIFG)!=0);     //若振荡器失效标志有效
    BCSCTL2 |= SELM1;             //使MCLK=XT2
    BCSCTL2 |= SELS+DIVS1;        //SMCLK=XT2,4分频,即2MHZ

    BoardConfig(0xb8);            // 关闭数码管、流水灯和电平转换
    ConfigUart0();                //配置UART0
    _EINT();                      //打开全局中断

    while(1)
    {
        LPM1;
    }
}


/*******************************************
函数名称:UART0_RXISR
功    能:UART0的接收中断服务函数,在这里唤醒
          CPU,使它退出低功耗模式
参    数:无
返回值 :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
    RecBuf[Rindex++] = RXBUF0;
    if(RecBuf[Rindex-1]==0xfe) //接收完毕
    {
        SendLen = Rindex;
        Rindex=0;
        if(RecBuf[0]==0xfd) //帧头正确
        {
            LPM1_EXIT;
            SDat = RecBuf;
            IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
        }
    }
}

/*******************************************
函数名称:UART0_TXISR
功    能:UART0的发送中断服务函数
参    数:无
返回值 :无
********************************************/
#pragma vector = UART0TX_VECTOR
__interrupt void UART0_TXISR(void)
{

      if(Tindex < SendLen)
      {
          TXBUF0 = *(SDat+Tindex);
          Tindex++;
      }
      else
      {
          Tindex=0;
          //LPM1;
      }

}



回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复