数码之家

 找回密码
 立即注册
搜索
查看: 5311|回复: 8

[C51] void SendData(BYTE dat) {while (busy);busy = 1;SBUF = dat;}这几段代码意思?

[复制链接]
发表于 2021-9-23 13:14:23 来自手机浏览器 | 显示全部楼层 |阅读模式
void SendData(BYTE dat)
{
    while (busy);           //Wait for the completion of the previous data is sent
    busy = 1;
    SBUF = dat;             //Send data to UART buffer
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2021-9-23 17:37:38 | 显示全部楼层
就是发送中断应该开了,发送完成busy会被置0,串口写进sbuf不是立刻就能发送出去的
回复 支持 反对

使用道具 举报

发表于 2021-9-23 18:17:12 | 显示全部楼层
有道在线翻译https://fanyi.youdao.com/
Wait for the completion of the previous data is sent   等待完成之前的数据被发送
Send data to UART buffer   发送数据到UART缓冲区
串口发送数据
回复 支持 反对

使用道具 举报

发表于 2021-9-23 18:41:21 | 显示全部楼层
串口发送数据函数,
while (busy);等待上次数据发送完成,
busy = 1;置忙,准备发送本次数据,
SBUF = dat; 发送数据到串口寄存器

串口中断函数里应该还有清忙操作,即 busy = 0;
回复 支持 反对

使用道具 举报

发表于 2021-9-23 19:24:51 | 显示全部楼层
本帖最后由 ks11900 于 2021-9-23 19:26 编辑

void SendData(BYTE dat)    BYTE dat是传入的数据
{
    while (busy);         busy是标志位,等于1时死循环,等于0时跳出循环,
    busy = 1;             busy标志位置1,等待下次发送完成后才会置为0
    SBUF = dat;           sbuf是串口接受发送共用寄存器,赋值为传入的数据会发送出去,串口接受到信号也是读取这个寄存器
}
回复 支持 反对

使用道具 举报

发表于 2021-9-24 08:58:56 | 显示全部楼层
要配合串口中断的函数来看

~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2021-9-24 09:27:15 | 显示全部楼层
向串口发送1个字节
回复 支持 反对

使用道具 举报

发表于 2021-9-24 10:32:25 | 显示全部楼层
应该是在总线为高电平时发送串口数据,总线为低电平的时候就做别的事情,概括的描述为:“视串口总线状态择机发送数据”,只是不理解既然用到了SBUF寄存器为什么不去判断TI状态而是外加了标志,而模拟串口的话应该用不到SBUF寄存器。
回复 支持 反对

使用道具 举报

发表于 2021-9-27 08:48:27 | 显示全部楼层
本帖最后由 mack13013 于 2021-9-27 08:51 编辑

void SendData(BYTE dat)
{
    while (busy)
         {
            ;
          }
    busy = 1;
    SBUF = dat;             //Send data to UART buffer
}

这样写你可能就能看明白了。
while (busy)
         {
            ;
          }

这里,当busy不为0时,就一直什么也不干等在这里(执行那个分号前内容,分号前是什么也没有,那就什么也不执行)。

busy应该是宏定义UART状态寄存器的空闲标志位,该标志位在UART不发送数据时,会被MCU硬件清空,所以程序在发送之前要先将其置1(busy=1;一句),然后将要发送的数据dat放到发送缓冲区SBUF(SBUF = dat;一句),MCU检测到发送缓冲区有写入动作时(即SBUF = dat;一句中的=会被编译为地址写入动作),就会将缓冲区的数据转化成UART的串行信号发送出去,同时发送完成的时候,会有MCU硬件将UART状态寄存器的空闲标志位(即busy)置为0。也就是说开头那个while如果检测到busy不为0,那么就要等在那里,因为还有数据没有发送完。
这里不需要发送中断的。这是硬件实现的UART器件,是MCU外设。一般接收需要中断,发送不用中断的,除非你需要配合DMA什么的才需要发送中断,这里直接用那个while不停的查询发送的状态是否空闲。


回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-8 06:27 , Processed in 0.265200 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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