各位大侠们!
1. 串口通信TI=1时,还可以继续进行串口通信发送功能吗?
2. 认为1不能发送,假设开始ES=0,它还会进入中断服务程序吗?
3. 课本中说ES=0,关闭了中断串口中断入口,实验中发现,下面程序可以正常运行!注释语句添不添加都无所谓!这究竟是为什么啊 !
ES=0;
flag=0;
send(fog);
while(!TI);
// TI=0; 这里我注释了
send(dat);
while(!TI);
// TI=0; 这里我注释了,不参与编译
ES=1;
void series() interrupt 4
{
if(RI==1)
{
dat=SBUF;
RI=0;
flag=1;
}
if(TI==1)
TI=0;
}
此帖出自
小平头技术问答
1 串口接收用中断是很有用并且很必须的事情——我怎么知道你什么时候给我发东西,难道我是海边的望夫石啊,天天等着老婆回来啊?所以,中断,实现了随机接收的功效。
至于发送,就像5L兄弟说的。我要发就发,发多少个我心里清楚,啥时候发我说了算,还中断干啥?中断多了,还会互相干扰,还要重新安排优先级,最糟糕的是,串口的收发还是同一个SBUF,诶哟喂,要命。
2 LZ的主要问题:
如ddllxxrr兄弟的回答那样——看到他的回答我基本就没有回帖欲望了,因为都让他说完了。
其实事情很简单,串口收发跟串口中断没有必然联系。那个TI标志只是用来告诉你收发完成,于是乎开启中断的时候,它摇身一变就成了串口中断,其实它来来去去就是个报站的兄弟:串口发送完成了,接受完成了....回家吃饭了。(中断来了)
那么,没有这个标志,会怎样呢?
也许你会觉得,不知道就不知道,管他呢,反正东西出去了......
问题在于,我很不幸地告诉你,51的串口缓冲,额,也就是你们说的SBUF只有一个字节,所以,也就是说,如果你根本不知道你接收了多少个数据.......并且你不知道你到底什么时候接收到一个数据,,,,,那么,曾小贤说,你懂的!
3 最后一个问题,关于TI的硬件清零和软件清零
书上说的是,当我们启动了中断,TI可以自动硬件清零,如果是没有开启中断,就要软件清零,这句话其是没什么好说,事情就是这样。
问题是它为啥要这么做呢,事情其实很简单,就在前面的第二点里,因为中断的情况下,一般的做法,我们会在串口中断里读出SBUF的数值,这个时候,它爱清不清,我管不着。如果不是的话,就需要给程序一个标志,直到我们读取出这个数值才清除标志。然后再次启动SBUF,就是给SBUF赋值。
不过,PS:貌似大家都养成了一种习惯,不仅查询TI RI标志的查询法以后,要请调TI RI,就是中断,也这么做,其实这是个好习惯,因为,确定了其状态。
一周热门 更多>