如题,请问51单片机接收数据的SBUF能存活多久呢? 比如下面这个串口中断复函函数(片段),我将接收中断标志RI清0之后,SBUF的值多久会消失呢?
unsigned char data = 0;
void Uartinterrpt(void) interrupt 4
{
if(RI == 1)
{
RI = 0;
// 假设这里过很久我才把SBUF接收的值拿出来, 使用delay ();
data = SBUF;
}
}
另外如果发送函数如下,SBUF拿发送值的时候 SBUF = c; 恰巧有接收数据被中断了,执行串口中断函数了,那么SBUF拿的值会不全(比如8位整个字节拿不全,拿了3位),造成发送乱码吗?
void SendByte(unsigned char c)
{
SBUF = c;
while(TI==0);
TI = 0;
}
SBUF是特殊寄存器,只要不写入新的数据就不会消失,写入新的数据就会覆盖之前的,单片机复位后初始值为不确定值。
中断处理完后会回到中断点继续执行,不存在接收到一半就发送出去。另外8位单片机赋值写入8bit数据应该是同时进行的,应该不会传到一部分就进入中断。
51单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
SBUF中的数据在不被新数据覆盖和不断电的情况下永久不变,也不会因为被读取而消失。CPU是通过并行总线读取寄存器,是一次读取8位即1个字节,不存在“8位整个字节拿不全”的说法