程序出问题了,麻烦高手帮忙解决一下!
程序的大体意思是这样的,我定义了一个全局变量USCRX_flag,number1(用于在中断中测试USCRX_flag加了多少次),number2(用于在主函数中测试USCRX_flag减了多少次),在串口中断中一旦接到了一帧以55 开头AA结尾的数据就让该全局变量USCRX_flag++,number1++,然后再main主函数while(1)中有一个while(USCRX_flag){USCRX_flag--;number2++};但是在调试程序中发现一个很严重的问题,如果电脑串口发送速度比较慢时,没问题number1 与(number2+USCRX_flag)是同步相等的(当你再调试中停止时,剩下的USCRX_flag与减少掉的USCRX_flag(number2)应该等于在中断中累计加到的USCRX_flag),但是如果电脑串口发送速度比较快时,就出现了一个现象number1比(number2+USCRX_flag)大。
我写的程序代码,大体如下:(代码不怎么全,我现在主要想知道为什么串口发送速度快了,就会出现number1 与(number2+USCRX_flag)不同步相等的原因,我在想即使是我串口中断程序写错了,或者是我的环形数组 Pre_Rcv_Buf[160满了,覆盖了以前的数据,那就是判断不出一条完整的一帧以55 开头AA结尾的数据,USCRX_flag , number1 不加就是了,那也不应该出现 number1 与(number2+USCRX_flag)不同步相等啊?是不是MSP430 单片机内部硬件有问题啊)
volatile unsigned char USCRX_flag=0,Rcv_flag=0;
unsigned char Pre_Rcv_Buf[160];
unsigned int number1=0;
unsigned int number2=0;
unsigned int number3=0;
#pragma vector=USCIAB0RX_VECTOR __interrupt
void USCI0RX_ISR(void)
{
unsigned int number=0
if((UCA0RXBUF == 0x55)&&(start==0)) //如果是第一次接受到55
{
start=1; //已经接受到了一个55
Pre_Rcv_Buf[ReceNum++]=UCA0RXBUF; //放入buffer
return;
}
if(start==1) // 如果已经接受到了一个55
{
Pre_Rcv_Buf[ReceNum++]=UCA0RXBUF; //继续放入到buffer数据
if(ReceNum>159) //如果超过了buffer的范围,从头重新存储
ReceNum=0;
testnumber++; //计数,自55后接受的数据个数,这里不会超过255的,我测试中一帧数据就11个字节
if(UCA0RXBUF==0xAA) //如果接受到了一个完整的帧
{
start=0;
testnumber=0;
USCRX_flag++; // 标志位加1
number1++; //该位为测试位,用于测试USCRX_flag 加了几次
}
else if((UCA0RXBUF==0x55)) //如果没接收到AA,有接受到了一个55,那就把自上次接受到的55 这组不完整帧的数据删除掉
{ if((ReceNum-testnumber)>= 0)
{ ReceNum -= testnumber; testnumber=0; }
else
{ ReceNum = 160-(testnumber-ReceNum); testnumber=0; }
}
}
}
main()
{
。。。。一段端口初始化程序
while(1)
{
while(USCRX_flag)
{
WDTCTL = WDTPW+WDTCNTCL+(WDTCTL&0x00ff); //清看门狗
USCRX_flag--;
number2++;
}
}
}