当前位置: 代码迷 >> 单片机 >> 51单片机 串口中断服务函数 c程序,该如何解决
  详细解决方案

51单片机 串口中断服务函数 c程序,该如何解决

热度:193   发布时间:2016-04-28 14:48:54.0
51单片机 串口中断服务函数 c程序
玩单片机有大约半年的时间了,今玩玩串口中断,搞不清它的工作过程(也就是不熟悉它的工作原理)
我想问的是
1 我先把数据装在串行发送寄存器(与串行接收寄存器共用一个物理地址),然后将数据发送出去,是在发送完SBUF中的数据后相应中断函数,还是在串行接收寄存器接受完数据相应中断服务函数?
2 我觉得这个用中断服务函数似乎没必要啊,我数据发送完,通过将TI置1,就可以作为标志位去串行接收数据了,不是吗???
请大神拍醒我,我是模糊了~~~

------解决思路----------------------
1、UART中断允许的情况下,数据发送完成及数据接受完成都会产生中断,可以读取SCON寄存器获知中断是发送完成还是接受完毕。
2、如果不用中断服务,你只能采用周期性检测SCON的方法,判断是否发送完成,这样会额外占用CPU时间,当然,如果你CPU资源够用的时候是无所谓的。

一般串口处理是这样,开环形缓冲*2,缓冲长度依据你片子资源调整到合适值,开发送/接收中断。
接收流程:
中断中收到数据就存入环形缓冲。
主循环中每个循环周期检测环形缓冲中是否有数据,有就取出处理。

发送流程:
将待发送的内容存入环形缓冲。
中断中判断环形缓冲中是否有数据,有就取出发送。

当然缓冲逻辑要有处理,比如缓冲满如何处理等。
------解决思路----------------------
中断发生在

接收:一个字节接收完毕
发送:一个字节发送完毕

接收中断的必要性,无需多说,
对于发送而言,每个字节发送一般需要几十微妙到n毫秒,现假设你有几十个字节要发送,那么你可以
1、在主循环里不断的检测TI,如果TI被置位,则发送下一个字节,直到数据发送完毕,但这毕竟低效,并且发送可能不连续,不是理想办法
2,、主循环准备好发送数据到一个特定缓冲区,然后发送第一个字节,其他的交由串口中断程序处理,这样主循环没有什么负担,并且发送数据连续
  相关解决方案