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条回答
孤獨の快樂
1楼-- · 2019-03-25 12:02

1 TI=1的时候,如果串口中断又打开的话,会一直进行中断的。你的series() interrupt 4里面已经有TI=0了,前面的TI=0就不用了。TI不清零也是可以发数据的,TI为1只是表示一帧数据的发送完毕,用来判断的。如果不清零,无法判断下一个数据是否发送完毕。如果在第一个数据没法送完毕再继续发送下一个数据,就会乱掉。


 

2 ES为0就关闭了串口中断,不会进入串口中断程序的

 

3 ES关了只能发不能收了吧

辛昕
2楼-- · 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,就是中断,也这么做,其实这是个好习惯,因为,确定了其状态。
孤獨の快樂
3楼-- · 2019-03-25 15:41

“当我们启动了中断,TI可以自动硬件清零”

这个我还真不知道呢

lnmisay
4楼-- · 2019-03-25 17:41
 精彩回答 2  元偷偷看……
lnmisay
5楼-- · 2019-03-25 19:38
非常感谢你的回复,
的确TI仅仅是一个标志而已,今天有个新的问题,
在串口通信工作方式0,工作下,课本中说发送数据引脚是3.0,发送同步时钟是3.1 TXD,可是我用示波器看到3.1是同步脉冲,跟程序写的频率是一样的,但是3.0 RXD脚一直是高电平,没有跳变的地方,我又想了好久,没找到结果。。。

还有我觉得 TI  标志还是只有软件清零,硬件清零做不到,在中断中删除掉 TI=0,程序就乱了。
_Justin
6楼-- · 2019-03-25 22:35
可能他说错了,串口接受数据以及发送数据时,没接收或者发送完一个串行帧,必定由硬件置位,但是!TI以及RI必须由软件清零。
在这里,我还想说一下下,在五个中断请求标志位中(其它四个再TCON中),IE0,IE1,TF0,TF1(其中TF0,TF1也可以软件清零)都是硬件置位,硬件清零。但是在串口中断中,SCON中,TI和RI是硬件置位,软件清零

一周热门 更多>