双缓冲与连续发送
双缓冲
在发送数据的时候,首先将要发送的字节写入TDR中,然后TDR将此字节发生给移位寄存器,由移位寄存器执行串并转换,通过Tx引脚逐个比特位发送出去。
在此过程中,存在两级缓冲,即双缓冲。首先,第一级缓冲是TDR,TDR会暂时帮我们保管下一个将要发送的数据,第二级缓冲是移位寄存器,缓存正在被发送的数据。
双缓冲与数据的连续发送相关。
连续发送
数据连续发送的过程:
1、例如我们有3个数据,首先将第一个数据写入TDR,由于此时移位寄存器为空,第一个数据直接进入移位寄存器被发送;
2、在第一个数据发送过程中,此时TDR为空,就将第二个数据也写入TDR,等待第一个数据发送完成;第一个数据发送完成后,第二个数据立即自动进入移位寄存器当中,继续进行发送,TDR再次为空;
3、再将第三个数据写入TDR,以此类推,实现数据的连续发送。
数据发送过程中的问题
由于数据写入过快导致的数据丢失问题,即:当我们第一个数据正在移位寄存器中被发送、第二个数据在TDR中排队时,又写入第三个数据,此时第三个数据会直接覆盖掉第二个数据,从而导致第二个数据的丢失。这就是覆盖问题。
由覆盖问题可知,过快写入数据会导致数据的丢失,因此我们需要等前面的数据发送完后,再将后面的数据写入TDR。但我们并不知道数据什么时候完成发送,此时需要通过SR(状态寄存器)的一些标志位(TXE、TC)进行判断。
数据接收过程中的问题
问题:什么时候读取数据?
接收数据时,通过Rx引脚去接受高低电平的波形,然后将波形解析成01这样的二进制比特位后,进入RDR寄存器里面供我们读取。但发送方什么时候会发送数据我们是不知道的,因此我们不知道什么时候去读取数据。
如果当我们读取过早时,数据还未进入RDR,此时会读出乱码;当我们读取过晚时,可能导致数据覆盖。
对于此问题同样需要借助SR寄存器中的标志位(RXEN)。
SR寄存器
TXE | RXNE | TC | PE | FE | NE | ORE |
6 | 5 | 4 | 3 | 2 | 1 | 0 |
TXE标志位:反映TDR寄存器当前是不是空的;如果有数据在TDR里面等待被发送,此时读取到TXE的值为0,反之没有数据则为1。
可通过读取TXE标志位,解决覆盖问题:
while(TXE==0);//等待发送数据寄存器为空
TDR=xxx; //将下一个数据写入TDR
TC标志位:代表发送完成,当TDR和移位寄存器均为空时,TC标志位为1。通过查询TC标志位判断数据是否发送完成。
单个数据发送:
while(TXE==0); //等待TDR清空
TDR=0x5a; //写入要发送的数据
while(TC==0); //等待数据发送完成
数据的连续发送:
for(i=0;i<n;i++)
{
while(TXE==0); //等待TDR清空
TDR=xxx; //写入要发送的数据
}
while(TC==0); //等待数据发送完成
RXNE标志位:接受数据寄存器非空,当RDR中没有数据时,RXNE标志位为0;当RDR中有数据时,RXNE标志位为1。
通过读取RXNE标志位,来接收单个数据:
unsigned int a;
while(RXNE==00); //等待RDR有数据需要读取
a=RXNE; //把数据读取出来
连续接收多个数据:
unsigned int a[10];
for(i=0;i<10;i++)
{
while(RXEN==0); //等待RDR有数据需要读取
a[i]=RDR; //立即把数据读取出来
}
错误标志位
串口用于传递各种各样的数据,在数据传递的过程中数据就有可能产生错误,在接收方收到数据之后,我们可以通过错误标志位来判断数据有没有错误。
SR(状态寄存器)有4个错误标志位(PE、FE、NE、ORE),每一个标志位代表在接收数据过程中发生了一种类型的错误。
在使用错误标志位时,通常需要先将其备份,因为读取完数据后,标志位又会自动置0。
PE奇偶校验错误
有时我们会把数据帧里面数据位的最后一个比特位拿出来作为校验位,当接收方检测到数据位与校验位奇偶不合时,就会判断发生错误(但不知道具体错误),此时PE标志位由0变1;如果奇偶没有错误,PE标志位依旧为0。
FE帧格式错误
对于数据帧来说,它具有起始位、数据位和停止位这三部分组成,如果我们在接收数据帧的过程中,接收方收到了起始位和数据位,但是没有收到停止位,我们就说发生了帧格式错误。此时,FE标志位由0变1,提示接收方收到的数据帧不完整。
NE噪声错误
数据帧由一个个高电平或低电平来表示,我们将其中的一个个高低电平叫做码元,接收方会采集码元:采集到高电平为1、低电平为0。并且不是简单的采集,它是使用一种叫做过采样的方式进行采集,即采样时使用高频率来采样多次。
对于USART串口来说,使用16倍波特率去采集,每个码元会被采集三次,三次均为同样的电平则表示数据无误。但在数据传递过程中,会引入噪声,导致一个码元采集到的电平不一样,无法判断这个比特位是0还是1。此时NE标志位由0变1。
ORE过载错误
指在数据接收过程中发生了数据覆盖,ORE会由0变1,提示接收方接收过慢,已经有数据倍覆盖了。