51串口通信

2019-03-24 19:23发布

  各位大侠们!          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;
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
辛昕
2019-03-25 12:25
LS的几位大大已经基本把串口收发和中断说完了,俺稍微做个简单总结哈,就三点:
1 串口接收用中断是很有用并且很必须的事情——我怎么知道你什么时候给我发东西,难道我是海边的望夫石啊,天天等着老婆回来啊?所以,中断,实现了随机接收的功效。
至于发送,就像5L兄弟说的。我要发就发,发多少个我心里清楚,啥时候发我说了算,还中断干啥?中断多了,还会互相干扰,还要重新安排优先级,最糟糕的是,串口的收发还是同一个SBUF,诶哟喂,要命。

2 LZ的主要问题:
   如ddllxxrr兄弟的回答那样——看到他的回答我基本就没有回帖欲望了,因为都让他说完了。
其实事情很简单,串口收发跟串口中断没有必然联系。那个TI标志只是用来告诉你收发完成,于是乎开启中断的时候,它摇身一变就成了串口中断,其实它来来去去就是个报站的兄弟:串口发送完成了,接受完成了....回家吃饭了。(中断来了)
那么,没有这个标志,会怎样呢?
也许你会觉得,不知道就不知道,管他呢,反正东西出去了......
问题在于,我很不幸地告诉你,51的串口缓冲,额,也就是你们说的SBUF只有一个字节,所以,也就是说,如果你根本不知道你接收了多少个数据.......并且你不知道你到底什么时候接收到一个数据,,,,,那么,曾小贤说,你懂的!

3 最后一个问题,关于TI的硬件清零和软件清零
书上说的是,当我们启动了中断,TI可以自动硬件清零,如果是没有开启中断,就要软件清零,这句话其是没什么好说,事情就是这样。
问题是它为啥要这么做呢,事情其实很简单,就在前面的第二点里,因为中断的情况下,一般的做法,我们会在串口中断里读出SBUF的数值,这个时候,它爱清不清,我管不着。如果不是的话,就需要给程序一个标志,直到我们读取出这个数值才清除标志。然后再次启动SBUF,就是给SBUF赋值。

不过,PS:貌似大家都养成了一种习惯,不仅查询TI RI标志的查询法以后,要请调TI RI,就是中断,也这么做,其实这是个好习惯,因为,确定了其状态。

一周热门 更多>