[求助] 51串口通信

lnmisay   2011-9-27 21:25 楼主

 

各位大侠们!

 

       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. 串口通信TI=1时,还可以继续进行串口通信发送功能吗?
这只是个判断标志,你若不判断,应能发,那就是胡乱发了,没章法。这个是硬件清零吧。
       2. 认为1不能发送,假设开始ES=0,它还会进入中断服务程序吗?
不会进有中断啦,因为你不允许中断  


       3. 课本中说ES=0,关闭了中断串口中断入口,实验中发现,下面程序可以正常运行!注释语句添不添加都无所谓!这究竟是为什么啊 !

这不为什么,就是不是用中断发的,是你用查询方法发的,中断函数形同虚设。木有用。
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2011-9-28 06:06

疑问!!

 

1. 首先TI标志在发送8位有效数据后会 硬件 置1, 在软件清0。非硬件清0.

 

2. 今天继续试验后,ES=0的确可以关闭 中断函数入口。

 

3. 现只有一种可能 , 当硬件置 发送标志 TI=1 后,无论TI为0,1,SBUF仍可以继续发送数据!!

 

4. 该程序段解释如下, 当ES=0后,关闭中断函数,现在程序发送fog数据,然后TI=1,没有清零,继续发送dat数据,没有清零,这时ES=1,开了中断函数入口,好,TI=1进入中断,中断内清零TI,函数勉强的运行起来了。

点赞  2011-9-28 21:52

回复 沙发 ddllxxrr 的帖子

1. 首先TI标志在发送8位有效数据后会 硬件 置1, 在软件清0。非硬件清0.



2. 今天继续试验后,ES=0的确可以关闭 中断函数入口。



3. 现只有一种可能 , 当硬件置 发送标志 TI=1 后,无论TI为0,1,SBUF仍可以继续发送数据!!



4. 该程序段解释如下, 当ES=0后,关闭中断函数,现在程序发送fog数据,然后TI=1,没有清零,继续发送dat数据,没有清零,这时ES=1,开了中断函数入口,好,TI=1进入中断,中断内清零TI,函数勉强的运行起来了。
点赞  2011-9-28 21:53

回复 楼主 lnmisay 的帖子

TI只是一个标志,它是用来确定在发送数据时是否发送完成的,在置一后必须由软件置零,我是这样想的,如果你不把它置0,那再次发送数据时是不会有问题,但是由于你没有将标志位软件置0,所以TI的值一直都为1,这样就造成你在再次发送数据时没法准确判断数据是否发送完成了没有,,

要使用串行中断,必须将ES置1开启串行中断允许,这是毋庸置疑的,但是,串行通讯程序不一定非要在串行中断里,为了更好的模块化编程,通常串行中断只负责接收,这样方便,每次接受完数据都会转入中断读取数据,而发送呢?放在中断中是很不方便的,因为你你要想发送必须进入中断,由于发送在中断函数中,所以,只能通过接收来进入中断,这样是很麻烦的,不如直接变一个子函数,想什么发送就什么时候发送。
点赞  2011-10-1 16:00

回复 板凳 lnmisay 的帖子

3的可能性比较大,毕竟TI只是个标志,即使TI不清0发送也应该没啥问题。
点赞  2011-10-1 16:13
TI不清不影响串口功能,但可能出错,当然,如果你严格控制时序,完全不理睬TI标志是完全可行的,只是没有那个必要,自己给自己找麻烦不是。
点赞  2011-10-2 01:10

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


 

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

 

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

点赞  2011-10-2 11:31
LS的几位大大已经基本把串口收发和中断说完了,俺稍微做个简单总结哈,就三点:
1 串口接收用中断是很有用并且很必须的事情——我怎么知道你什么时候给我发东西,难道我是海边的望夫石啊,天天等着老婆回来啊?所以,中断,实现了随机接收的功效。
至于发送,就像5L兄弟说的。我要发就发,发多少个我心里清楚,啥时候发我说了算,还中断干啥?中断多了,还会互相干扰,还要重新安排优先级,最糟糕的是,串口的收发还是同一个SBUF,诶哟喂,要命。

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

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

不过,PS:貌似大家都养成了一种习惯,不仅查询TI RI标志的查询法以后,要请调TI RI,就是中断,也这么做,其实这是个好习惯,因为,确定了其状态。
强者为尊,弱者,死无葬身之地
点赞  2011-10-2 11:45

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

这个我还真不知道呢

点赞  2011-10-3 10:26

回复 9楼 辛昕 的帖子

非常感谢你的回复,
的确TI仅仅是一个标志而已,今天有个新的问题,
在串口通信工作方式0,工作下,课本中说发送数据引脚是3.0,发送同步时钟是3.1  TXD,可是我用示波器看到3.1是同步脉冲,跟程序写的频率是一样的,但是3.0 RXD脚一直是高电平,没有跳变的地方,我又想了好久,没找到结果。。。
点赞  2011-10-4 22:31

回复 8楼 孤獨の快樂 的帖子

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

还有我觉得 TI  标志还是只有软件清零,硬件清零做不到,在中断中删除掉 TI=0,程序就乱了。
点赞  2011-10-4 22:33

回复 12楼 lnmisay 的帖子

可能他说错了,串口接受数据以及发送数据时,没接收或者发送完一个串行帧,必定由硬件置位,但是!TI以及RI必须由软件清零。
在这里,我还想说一下下,在五个中断请求标志位中(其它四个再TCON中),IE0,IE1,TF0,TF1(其中TF0,TF1也可以软件清零)都是硬件置位,硬件清零。但是在串口中断中,SCON中,TI和RI是硬件置位,软件清零
点赞  2011-10-5 12:32

回复 12楼 lnmisay 的帖子

把你的程序贴出来。。。。。。。要不找不到解决的办法!!!!!
点赞  2011-10-5 14:10

回复 13楼 _Justin 的帖子

程序暂时找不到了,,非常感谢,,



最近去弄串口工作方式0去了,波形在RXD引脚还是不正确,,,纠结了。。。
点赞  2011-10-5 16:03

回复 9楼 辛昕 的帖子

好像收发的时候是两个SBUF,但是这两个SBUF的地址一样。不知道我说的对不对,请指教
点赞  2012-3-1 16:45
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复