发一段调试串口的代码,请高手看看哪里有问题

2019-03-24 13:43发布

前几天写了一段小程序,验证一下串口的。我的意思是每次从电脑的串口调试助手里发字符"OK"过去,lunchpad一次返回‘A'、'B'、'C'。不过每次它都返回的是A。而改变rx_count这个变量,直接给它赋值(而不是自加),它三个字母都可以分别返回给串口调试助手。好郁闷,请高手看看。
      另外,我用IAR、CCS的debug,得到的是一样的结果。单步查看rx_count这个变量,发现它在每次进入中断,出来后都变成0了。问题就在这里了。可是什么原因呢?

#include<msp430g2553.h>
int rx_count=0;
int OK=0;
int rx_data[2];
unsigned char i=0;
void sent(char x);
void rx_deal();

void main()
{
        P1DIR |= BIT0;
        P1OUT =BIT0;

        P1SEL |= BIT1 + BIT2;
        P1SEL2 |= BIT1 + BIT2;                        //选为RXD和TXD

        UCA0CTL1 |= UCSSEL_1;                     // CLK = ACLK
        UCA0BR0 = 0x03;                           // 32kHz/9600 = 3.41
        UCA0BR1 = 0x00;                           //
        UCA0MCTL = UCBRS1 + UCBRS0;               // Modulation UCBRSx = 3
        UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
        IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

        while(1)
        {
                __bis_SR_register(LPM3_bits + GIE);
                rx_deal();
                if(OK==1)
                {
                        OK=0;
                        switch(rx_count)
                        {
                                case 1: { sent('A');break; }
                                case 2: { sent('B');break; }
                                case 3: { sent('C');break; }
                                default:break;
                        }
                }
        }
}


void rx_deal()                                        //如果收到的是OK,变量OK就为1,同时判断是第几次收到
{
        if(rx_data[0]=='O' && rx_data[1]=='K')
        {
                rx_count++;                                //每次执行函数 rx_count都是1;为什么不能自加
                if(rx_count==4){rx_count=1;}
                OK=1;
                rx_data[0]=0;
                rx_data[1]=0;
        }
        else
                OK=0;
}

void sent(char x)                        //发送一个字节的函数
{
        while (!(IFG2&UCA0TXIFG));
        UCA0TXBUF=x;
}

#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
        rx_data=UCA0RXBUF;
        i++;
        if(i==2)
        {
                i=0;
                LPM3_EXIT;
        }
}
0条回答

一周热门 更多>

相关问题

    相关文章