51单片机的串口驱动的代码逻辑

发布时间:2024年01月01日

什么是串口通信?

51单片机中,串口通信指的是单片机和其他的机器传递数据的时候是通过一个bit一个bit的形式传输的,值得一提的话,串口通信是硬件串口。什么意思呢?也就是在传递比特的时候,不用软件来模拟比特传输时的时序,由硬件自动传输。那么需要发送的数据怎么告诉硬件让其传输的呢?由于在软件串口中,比特和比特的传输是实时的,数据源直接传给收取源,这个是没有中间的缓存的,没有缓存的数组或者是缓存的寄存器。而硬件串口的话,由于你要交给一个封装好的硬件串口模块,则这个模块必须得有一个接口,这个接口就是SBUF(一个字节),内置的寄存器(其实有两个,一个只读,一个只写),作为需要输出和输入的一个中间人,所以所有通过串口输入输出的字节都是需要通过这个SBUF的,所以就会出现上一篇文章讲的SBUF被覆盖的问题,所以每次数据源——SBUF——串口通信,这个阶段就必须得上一个锁什么时候解锁呢?当串口传输完了8个字节的时候,内部硬件自动将TI或者是RI置为1,进而触发串口中断,这个时候就需要到串口中断中处理查看,看看是接受完了一个字节,还是发送完了一个字节,在处理中断程序中,如果是发送完成,则就解锁,让数据源将后续的数据赋值到SBUF中,进而通过SBUF通过串口通信发送出去。

(一个重要的原则:如果你的主机作为发送方的话,不需要考虑发送的数据是以什么形式存到接收方里面的,你只需要负责发送数据就好了。只有接收的才是需要考虑到缓存的事情的。)

串口通信的代码逻辑

有缓存串口通信的思路:由于串口通信是硬件串口,所以需要借助SBUF的帮助,存储字节,所有输入输出的字节都是需要经过SBUF才可以出去的。输出的时候不用缓存,输入的时候才有缓存。

输出的时候,字节通过SBUF,然后再经过SBUF进行输出,等到SBUF输出完毕的时候,触发中断,再进行第二字节的输出。

输入的时候,先输入进SBUF,等SBUF输入满的时候,那么就触发中断,将SBUF中的一个字节,写到缓存中去,再进行下一个字节的接收,在字节接收到缓存的过程中,同时又在将缓存中的数读出来,读到一个空的数组当中去,但是有些时候,从缓存读到数组中的速度有些块,这个时候就需要等待SBUF中的字节写到缓存中,才能将缓存中的字节写到空数组中,所以最得判断一下,这个缓存是否是空的,如果是空的话,那么就延迟一毫秒,再读一遍,如果下一个循环还是0的话,那么就是真的已经读完了。

这个就是上述输入输出的全过程。

需要注意的点:

(1)发送字节的时候,记得上锁,否则会出现SBUF发送到一半字节而出现覆盖的情况。

(2)需要重视一下buffer——>外部空数组读取太快的问题。

(3)其中的缓存是全部利用的,不用考虑字符串最后一个是0的问题

(4)字符串最后一个是0的问题,一般是放到暴露函数中处理。

(5)创建的缓存可以封装成一个结构体,且这个缓存是一个循环队列,这个循环队列有队首和元素的个数,其中用(队首 + 元素个数)%max 组成了队尾,队尾就是下一个元素加进来的地方。

串口通信首先就是初始化,使用到了好几个寄存器,IE,SCON,PCON,TCON等寄存器,还有TMOD和TH和TL的初始化,这个一定需要倒背如流。

我们先来看看需要暴露的函数有哪些:初始化函数,发送字符串的函数,收取字符串的函数,判断缓存中是否有元素的函数。

内部的函数有那些呢:初始化函数,发送字符串的函数,收取字符串的函数,判断缓存中是否有元素的函数。发送单个字节的函数,收取单个字节的函数,从SBUF到缓存的函数,从缓存到空数组的函数。

文章来源:https://blog.csdn.net/Caesar2334/article/details/135278257
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。