stc89c52单片机和串口调试助手通信时,串口调试助手发送给单片机的数据不能回传给串口调试助手请问为什么
voidserial_int(void)interrupt4{if(RI){RI=0;temp=SBUF;SBUF=temp;while(!TI);TI=0;while(...
void serial_int(void) interrupt 4
{
if(RI)
{
RI=0;
temp=SBUF;
SBUF=temp;
while(!TI);
TI=0;
while(1);/*如果发送4,5个字节,没有循环和延时的时候是可以全部回传到串口调试助手里的,如果加了7秒的延时,只有前两个字节可以回传到串口调试助手里,如果在中断里加了死循环就什么也不能回传了即使发送一个字节有死循环的情况也不能回传,谁知道这原因?*/
}
} 展开
{
if(RI)
{
RI=0;
temp=SBUF;
SBUF=temp;
while(!TI);
TI=0;
while(1);/*如果发送4,5个字节,没有循环和延时的时候是可以全部回传到串口调试助手里的,如果加了7秒的延时,只有前两个字节可以回传到串口调试助手里,如果在中断里加了死循环就什么也不能回传了即使发送一个字节有死循环的情况也不能回传,谁知道这原因?*/
}
} 展开
1个回答
展开全部
嵌入式编程有个不成文的规则:中断函数里面的语句尽量简短,尽量少处理浮点运算,尽量不要使用死循环!你上面写的程序不规范,你把程序这样写:
void serial_int(void) interrupt 4
{
if(RI)
{
RI=0;
temp=SBUF;
SBUF=temp;
}
else if(TI)
{
TI=0;
}
}
这样应该就可以实现了!
void serial_int(void) interrupt 4
{
if(RI)
{
RI=0;
temp=SBUF;
SBUF=temp;
}
else if(TI)
{
TI=0;
}
}
这样应该就可以实现了!
追问
是的,但是我这是做实验,编译也没有错误,我最难理解的是加了while(1);后为什么连一个字节也不能回传了,加了七秒还能立刻回传到串口调试助手。没有延时和死循环时同时发四五个字节都可以完全回传,加了7s延时就只能回传前两个字节,加了死循环一个也不能回传,请问这怎么解释呢
追答
不要相信编译器,编译器不是万能的,它仅仅只是帮你检查出来语法错误而已。
对于你的这种情况,我想你使用while循环就等于停在中断服务程序里面了,这样就无法再返回到中断服务程序了,要不然你就直接禁止中断,发送和接收都是用循环查询的方法!我是没这样写过程序,这样写不好,如果是大型的程序的话很容易造成死机和程序跑飞的现象。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询