找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3373|回复: 5
打印 上一主题 下一主题
收起左侧

51单片机串口中断函数中SBUF的值能存在多久?

[复制链接]
跳转到指定楼层
楼主
ID:482935 发表于 2020-5-8 07:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,请问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;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:282850 发表于 2020-5-8 09:26 | 只看该作者
SBUF在下一次串口中断来之前是不变的,但中断内不应加延时,并且要尽快取走数据为好。
回复

使用道具 举报

板凳
ID:452950 发表于 2020-5-8 09:42 | 只看该作者
SBUF是特殊寄存器,只要不写入新的数据就不会消失,写入新的数据就会覆盖之前的,单片机复位后初始值为不确定值。
中断处理完后会回到中断点继续执行,不存在接收到一半就发送出去。另外8位单片机赋值写入8bit数据应该是同时进行的,应该不会传到一部分就进入中断。
回复

使用道具 举报

地板
ID:213173 发表于 2020-5-8 10:30 | 只看该作者
51单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
SBUF中的数据在不被新数据覆盖和不断电的情况下永久不变,也不会因为被读取而消失。CPU是通过并行总线读取寄存器,是一次读取8位即1个字节,不存在“8位整个字节拿不全”的说法。
回复

使用道具 举报

5#
ID:440553 发表于 2020-5-8 10:53 | 只看该作者
直到单片机断电、重启,或者再次接收到串口中断
回复

使用道具 举报

6#
ID:910171 发表于 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就一直保持不变?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表