标题: 51单片机串口中断函数中SBUF的值能存在多久? [打印本页]

作者: 13681878016    时间: 2020-5-8 07:29
标题: 51单片机串口中断函数中SBUF的值能存在多久?
如题,请问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;
}



作者: f556    时间: 2020-5-8 09:26
SBUF在下一次串口中断来之前是不变的,但中断内不应加延时,并且要尽快取走数据为好。
作者: xxpp2011    时间: 2020-5-8 09:42
SBUF是特殊寄存器,只要不写入新的数据就不会消失,写入新的数据就会覆盖之前的,单片机复位后初始值为不确定值。
中断处理完后会回到中断点继续执行,不存在接收到一半就发送出去。另外8位单片机赋值写入8bit数据应该是同时进行的,应该不会传到一部分就进入中断。
作者: wulin    时间: 2020-5-8 10:30
51单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
SBUF中的数据在不被新数据覆盖和不断电的情况下永久不变,也不会因为被读取而消失。CPU是通过并行总线读取寄存器,是一次读取8位即1个字节,不存在“8位整个字节拿不全”的说法。
作者: bobo233    时间: 2020-5-8 10:53
直到单片机断电、重启,或者再次接收到串口中断
作者: Fireflying    时间: 2021-4-28 11:47
wulin 发表于 2020-5-8 10:30
51单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SB ...

请问老师,假如我用程序检测到RI变成1了,然后我用Rdata=SBUF读取数据,但是不对RI操作,也就是RI不清零。而串口还有新的数据源源不断的进来,这种情况下,SBUF里面的数据会更新吗?会跟随串口新进来的数据变化么?还是只要不清零RI就一直保持不变?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1