前几天写了一段小程序,验证一下串口的。我的意思是每次从电脑的串口调试助手里发字符"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;
}
}
一周热门 更多>