标题: 蓝牙与跑步机的单片机UART中断理解 [打印本页]

作者: 1314love    时间: 2022-10-12 09:04
标题: 蓝牙与跑步机的单片机UART中断理解
这个是单片机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;//切为接收模式
                }
        }

}


作者: yzwzfyz    时间: 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,表示发送完成,请示新的发送。
作者: 人工置顶员    时间: 2022-10-12 23:49
顶一下




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