tt彩票代理: [MCU] MSP430只能识别一次指令

永利游戏开户直营
192|2
楼主
 楼主 | 2019-9-25 15:30 | 只看该作者 ||退出气泡模式 |倒序浏览 |阅读模式
通过串口给430发送指令,tt彩票代理:识别不同的指令,点亮不同的灯,每次上电就能识别第一个指令,后面的指令都显示错误,不知道什么原因。
是通过PC的串口调试助手,发送指令的。第一个指令能识别,后面的都识别出来提示错误。
有熟悉430的帮忙看看,以下是代码,第一次用430,还不太熟悉。

#include  <msp430x14x.h>

//定义串口操作变量
// 串口 1 的接收标志
char nRev_UART0;                       
// 串口 1 的接收缓冲区       
char UART0_RX_BUF[20];               
char nRX0_Len;
char nRX0_Len_temp;


int ProcessCMD(char pBuf[],int nLen)
{
    int nTemp = -1;
   
    if(nLen <= 2) return -1;
   
        if (nLen == 6)
        {
                if((pBuf[0] == 'M') && (pBuf[1] == 'O')
                        && (pBuf[2] == 'D') && (pBuf[3] == 'E')
                        && (pBuf[4] == '1'))
                        nTemp = 1;
                if((pBuf[0] == 'M') && (pBuf[1] == 'O')
                        && (pBuf[2] == 'D') && (pBuf[3] == 'E')
                        && (pBuf[4] == '2'))
                        nTemp = 2;
                if((pBuf[0] == 'M') && (pBuf[1] == 'O')
                        && (pBuf[2] == 'D') && (pBuf[3] == 'E')
                        && (pBuf[4] == '3'))
                        nTemp = 3;
                if((pBuf[0] == 'M') && (pBuf[1] == 'O')
                        && (pBuf[2] == 'D') && (pBuf[3] == 'E')
                        && (pBuf[4] == '4'))
                        nTemp = 4;
                if((pBuf[0] == 'C') && (pBuf[1] == 'L')
                        && (pBuf[2] == 'O') && (pBuf[3] == 'S')
                        && (pBuf[4] == 'E'))
                        nTemp = 5;
        }
        
        
        if (nLen == 5)
        {
                if((pBuf[0] == 'O') && (pBuf[1] == 'P')
                        && (pBuf[2] == 'E') && (pBuf[3] == 'N'))
                        nTemp = 6;
        }
   
    return nTemp;
}

/********************主函数********************/
void main(void)
{
    char UART0_RX_Temp[20];   
    int i;
    int nRes = 0;
/*下面六行程序关闭所有的IO口*/
    P1DIR = 0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
    P3DIR = 0XFF;P3OUT = 0XFF;
    P4DIR = 0XFF;P4OUT = 0XFF;
    P5DIR = 0XFF;P5OUT = 0XFF;
    P6DIR = 0XFF;P6OUT = 0XFF;
   
    WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗
    P6DIR |= BIT2;P6OUT |= BIT2;              //关闭电平转换
   
    P3SEL |= 0x30;                            // 选择P3.4和P3.5做UART通信端口
    ME1 |= UTXE0 + URXE0;                     // 使能USART0的发送和接受
    UCTL0 |= CHAR;                            // 选择8位字符
    UTCTL0 |= SSEL0;                          // UCLK = ACLK
    UBR00 = 0x03;                             // 波特率9600
    UBR10 = 0x00;                             //
    UMCTL0 = 0x4A;                            // Modulation
    UCTL0 &= ~SWRST;                          // 初始化UART状态机
    IE1 |= URXIE0;                            // 使能USART0的接收中断

    while(1)
    {
        _EINT();                               //打开全局中断
        LPM1;                                  //进入LPM1模式

        if(nRev_UART0 == 1)
            {
                nRev_UART0 = 0;
                        // 将接收到的数据拷贝到临时缓冲区
                        for(i = 0;i < nRX0_Len;i++)
                                UART0_RX_Temp[i] = UART0_RX_BUF[i];
                        nRes = ProcessCMD(UART0_RX_Temp,nRX0_Len);
                        switch(nRes)
                        {
                        case 1:
                                P3OUT = 0X1;
                                nRX0_Len = 0;
                                break;
                        case 2:
                                P3OUT = 0X2;
                                nRX0_Len = 0;
                                break;
                        case 3:               
                                P3OUT = 0X4;
                                nRX0_Len = 0;
                                break;
                        case 4:               
                                P3OUT = 0X8;
                                nRX0_Len = 0;
                                break;
                        case 5:               
                                P3OUT = 0X10;
                                nRX0_Len = 0;
                                break;
                        case 6:               
                                P3OUT = 0X40;
                                nRX0_Len = 0;
                                break;
                        case -1:

                                nRX0_Len = 0;
                                break;
                        }

        }
    }
}
/*******************************************
函数名称:UART0_RXISR
功    能:UART0的接收中断服务函数,在这里唤醒
          CPU,使它退出低功耗模式
参    数:无
返回值  :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{

  LPM1_EXIT;                 //退出低功耗模式
  
  UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;        //接收来自的数据
   
  nRX0_Len_temp += 1;
        
  if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13)
  {
    nRX0_Len = nRX0_Len_temp;
    nRev_UART0 = 1;
    nRX0_Len_temp = 0;
  }
  
}


沙发
| 2019-9-25 22:00 | 只看该作者
是不是串口的外设时钟没打开啊?
板凳
| 2019-9-30 10:15 | 只看该作者

/********************主函数********************/
void main(void)
{
    char UART0_RX_Temp[20];   
    int i;
    int nRes = 0;
/*下面六行程序关闭所有的IO口*/
    P1DIR = 0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
    P3DIR = 0XFF;P3OUT = 0XFF;
    P4DIR = 0XFF;P4OUT = 0XFF;
    P5DIR = 0XFF;P5OUT = 0XFF;
    P6DIR = 0XFF;P6OUT = 0XFF;
   
    WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗
    P6DIR |= BIT2;P6OUT |= BIT2;              //关闭电平转换
   
    P3SEL |= 0x30;                            // 选择P3.4和P3.5做UART通信端口
    ME1 |= UTXE0 + URXE0;                     // 使能USART0的发送和接受
    UCTL0 |= CHAR;                            // 选择8位字符
    UTCTL0 |= SSEL0;                          // UCLK = ACLK
    UBR00 = 0x03;                             // 波特率9600
    UBR10 = 0x00;                             //
    UMCTL0 = 0x4A;                            // Modulation
    UCTL0 &= ~SWRST;                          // 初始化UART状态机
    IE1 |= URXIE0;                            // 使能USART0的接收中断
        _EINT();                               //打开全局中断

        while(1)
        {
                if (!bRxok)
                {
                        LPM1;                          //进入LPM1模式
                }
                else
                {
                        ProcessCMD(UART0_RX_BUF,nRX0_Len_temp);
                        nRX0_Len_temp = 0;
                        bRxok = 0;
                }
        }
}

bit bRxOk = 0;
/*******************************************
函数名称:UART0_RXISR
功    能:UART0的接收中断服务函数,在这里唤醒
          CPU,使它退出低功耗模式
参    数:无
返回值  :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{

        LPM1_EXIT;                 //退出低功耗模式

        u8 ucTmm = RXBUF0;
        if (!bRxOk && nRX0_Len_temp < sizeof(UART0_RX_BUF))
        {
                UART0_RX_BUF[nRX0_Len_temp++] = ucTmm;        //接收来自的数据
        }
        if (ucTmm == '\x0d')
        {
                bRxOk = 1;
        }
}
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

永利游戏开户直营 快速回复 返回顶部 返回列表
新世纪VR金星1.5分彩彩票官网 www,668m,cc 88赌城FG www.88现金网 处女星号VR彩票开奖号历史
吉祥彩票正规直营网 冠军彩票网站 好彩票正规直营网 j8彩票app下载 彩16游戏直营网
乐趣彩票手机下载 568专业彩票官网直营网 吉祥博彩票手机下载直营网 彩票在线平台直营网 彩天堂网站直营网
时时彩官方直营网 摇彩票在线开户 www.687.net 198彩手机下载 大赢家彩票网站直营网