找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝牙与跑步机的单片机UART中断理解

[复制链接]
跳转到指定楼层
楼主
ID:1041297 发表于 2022-10-12 09:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个是单片机UART的寄存器,请问这一句
其它方式时,在停止位开始发送时由硬件置 1
是不是当SBUF接收到数据后,并发送成功后,也就是SBUF接收到数据,然后发送1个起始位,8位数据位,一个停止位,在发停止位的时候硬件就置1,下面是一段代码,我是这么理解的,如果有一个丛机,检测到硬件置一,就可以让我主机进入中断,从而继续接收数据,发送数据,发送完成后,又继续他那边处理好逻辑,让我这边继续进入中断,以此反复.我这样理解是否正确,请大伙给我讲讲(跑步机与蓝牙的通讯,主机是跑步机,从机是app的蓝牙模块)


TI
发送中断请求中断标志位
0:软件清 0
1:方式 0 时,当串行发送数据第 8 位结束时,由硬件自动置 1,其它方
式时,在停止位开始发送时由硬件置 1

下面我只拿了一点点程序,就是说SBUF接收到数据,并发送成功,就会跳到中断里面再准备数据,再次发送成功后会再跳入中断,从机那边做好逻辑处理,我这边就可以再接收数据,然后发送,所以我想想问问上面那个UART是不是那样理解来理解下面这个程序
#include “blue.c”
SBUF=mBLUE.ucWriteBuff[0];//发送第0个元素,进入中断从第1个元素开始发
mBLUE.ucRxdNumber = 0;//确保接收数据时,从第0个元素开始存起
mBLUE.Olready_Txd_cnt = 1;//1表已经发送了一个字节了


/*
函数功能:定时器0中断服务函数
参数:无
返回值:无
备注:100us执行一次
*/
void TIMER0_Rpt(void) interrupt TIMER0_VECTOR

{
if(SCON & 0x02)//发送数据
        {
                SCON &=~ 0x02;                                    //清除发送中断标志位

                if(mBLUE.Olready_Txd_cnt < mBLUE.ucTxdNumber)
            {
                SBUF = mBLUE.ucWriteBuff[mBLUE.Olready_Txd_cnt];
                mBLUE.Olready_Txd_cnt++;
            }
                else//发送完成一帧数据
                {
                        mBLUE.T_R_falg = Received;//切为接收模式
                }
        }

}

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

使用道具 举报

沙发
ID:123289 发表于 2022-10-12 10:57 | 只看该作者
1、串行脉冲由:引导、起始、数据、校验、停止,组成。
其中的数据由SBUF提供。
2、假设起始时刻,或更前SBUF收到数据时,给出TI。则,你可能收到TI后,即可能立即(中断响应后)向SBUF中灌入新数据,这样上次的数据就丢失了,而上次数据的串出时需要时间的,例9600的波特率,约0.1ms串出一位,串出一个完整的数据到少11个脉冲,即1.1ms,而程序1.1ms,上百条指令执行完毕了。
如此,上次发送的数据就完蛋了。
所以:合理的TI=1时刻,应当是在发送完成之后,即停止脉冲发出之后。
我相信CPU的硬件设计,应当是停止脉冲发出后,将TI置1,表示发送完成,请示新的发送。
回复

使用道具 举报

板凳
ID:301191 发表于 2022-10-12 23:49 | 只看该作者
顶一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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