微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 程序问题,各位大神救救命

程序问题,各位大神救救命

时间:10-02 整理:3721RD 点击:
各位大神我不知道为什么我删掉while(!TI)服务函数加多TI=1时 为什么会狂收数据而且延时会变长,还有一上电的时候数据是不是放在SBUF那里
谢谢




在使用发送的情况下,进了串口中断,TI = 1,你加这句跟没加一样。然后你的TI清零也应该要放在中断里面。像你这样使用的TI=0放在外面的情况,在执行完TI=0这一语句前,会产生这样的可能性,因TI=1,就反复进入中断,中断里num=SBUF,当然就在狂收数据了。进入中断次数多了,当然延迟就变长了
你这样写程序很有问题的。你应该是在串口中断里面判断串口中断是属于接收中断还是发送中断,然后在中断里清中断标志,具体说来,大概就是这么写
void serial_isr () interrupt 4   
{
    if (RI == 1)
    {
        RI = 0;
        用户代码
    }
    else  if (TI == 1)            //这里或许不用else, 直接 if (TI == 1), 不知道这样会有什么影响吗
    {
        TI = 0;
       用户代码
    }
}

不能删掉while(!TI)服务函数加多TI=1时  会出问题的。  因为程序进入死循环。

串口中断一般都要对发送中断和接收中断都处理。因为你没有在中断函数里面对TI清零,主函数串口发送时会不断的进入中断。这就是为什么狂收数据延时加长。

TI = 0 ;这个最好放到中断里面执行,而不是放在主程序里面

谢谢 各位大神

谢谢  不过有个问题想要请教下  到底是什么让串口产生中断执行下面的中断服务

当打开串口中断后,串口接收到一个字节或者发送完一个字节数据后,就产生串口中断。

哦  谢谢   但是在我这程序中貌似有点迷茫  产生中断后才进入服务中断,但是开始我并没有发送数据 就没产生中断  if(flag)中flag并没=1啊  难解

这个就不懂你哦,给能我看看程序?

如果是你原有的那个程序,那么进中断的原因也有可能是接收到了数据。所以,如果你想要验证是不是因为接收到数据而进中断的话,你可以屏蔽掉接收中断,只允许发送中断,即在串口初始化程序中REN = 0。
屏蔽掉接收中断后就没这个现象后说明是接收到数据引起的,如果是这样的话,为什么刚上电会接收到数据,你就问下其他人了,我也没头绪,如果手头上有板子可仿真,或许能找出原因。
另外,你的程序中,flag只有定义,没看见你初始化,最好还是初始化一下比较好。


就在上面呀  看到没

非常感谢            

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top