PC控制单片机,串口中断接到数据后如何才能跳出进行中的大循环?

如果接到0XAA 时可以进入大循环,但接到0X55时,不能跳出停止大循环,不知是何原因?请老师们指点,谢谢!
void main()
{
init();
while(1)
{
if(dat==0x55)
{
break;
}
else if(dat==0xaa)
{
while(1)
{
led=0;
delay_s(100);
led=1;
delay_s(100);
}
}

}

}

void ser() interrupt 4
{
if(RI)
{
RI = 0;
dat = SBUF;
switch(dat)
{
case 0x11:
led = 0;
break;
case 0x12:
led = 1;
break;
}

}

}

你的问题在于 dat = 0xaa后进入死循环。实际只要将
if(dat==0x55)
{
break;
}
这句移入if(dat==0xaa) 执行的while(1)循环即可。改成这样
while(1)
{
if(dat==0xaa)
{
while(1)
{
led=0;
delay_s(100);
led=1;
delay_s(100);
if(dat==0x55)
{
break;
}

}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-25
void main()
{
init();
while(1)
{
if(dat==0x55)
{
break;
}
else if(dat==0xaa)
{
while(1)//标记
{
led=0;
delay_s(100);
led=1;
delay_s(100);
}
}
慎用while(1)这样的死循环,跳出不的原因就在标记处。
你这个要改都是很容易的事情
void main()
{
init();
while(1)
{
while(dat==0x55); //如果==55H就死等在这,不=就跳出
while(dat==0xaa) //跳出就执行循环并查询dat,如果不等于AAH那就就上去死等
{
led=0;
delay_s(100);
led=1;
delay_s(100);
}
}
}

楼下用查询法也可以,但不能完整表达你的意思。或者把我标记的while(1)去掉即可。

顺便可以学习一下协议贞,单字节容易引发误操作。还可以学习一下printf()这个库函数的操作
第2个回答  2012-12-25
单纯是跳出循环,那么:
else if(dat==0xaa)
{
while(1)
{
led=0;
delay_s(100);
led=1;
delay_s(100);
}
}

改成:
else if(dat==0xaa)
{
led=0;
delay_s(100);
led=1;
delay_s(100);
}
但是一旦跳出,你的程序就跑飞了!
如果你想实现收到指令0xaa就闪灯,建议改成:
void main()
{
init();

while(1)
{
if(dat==0xaa)
{
led=0;
delay_s(100);
led=1;
delay_s(100);

}}}
以上供参考。追问

但是我怎样才能跳出闪灯循环呢?比如:接到0XAA时进入闪灯不断循环,如果接收到0X55时就跳出进行中的循环灯熄灭,只有再次接到0XAA又进入闪灯不断循环?

追答

按我上面给你改的main()就行了啊。

追问

是否把
if(dat==0x55)
{
break;
}
放在while(1)里面呢?才能实现收到0X55就跳出循环呢?

追答

如果:收到指令0XAA就闪,收到指令0X55就不闪,其他指令保持当前状态不变,那么:
int flag;
void main()
{
init();
while(1)
{
if(flag)
{
led=0;
delay_s(100);
led=1;
delay_s(100);
}}}

void ser() interrupt 4
{
if(RI)
{
RI = 0;
dat = SBUF;
switch(dat)
{
case 0x11:
led = 0;
flag=0;
break;
case 0x12:
led = 1;
flag=0;
break;
case 0xaa:
flag = 1;
break;
case 0x55:
flag = 0;
break;
}}}

如果你的 init(),delay_s()没有问题的话,以上程序应该可以实现功能的。

本回答被提问者采纳
第3个回答  2012-12-25
先对你的程序提一点小建议 思路理清 太乱了 还有就是中断程序里面少写东西

针对你的问题 你把break去掉 试试
相似回答