打印

难以置信的串口中断---STC单片机

[复制链接]
3966|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lifeinjoy|  楼主 | 2013-1-14 19:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发送一个字节到底进几次串口中断?
用的芯片为:STC10F08XE
1、发现问题的代码:
void isrSerial(void) interrupt 4
{
    if(RI)
        {
                RI = 0;
                RcvBuffer[RcvNumber++] = SBUF;       
                if (RcvNumber == RCVBUFLEN) RcvNumber = 0;                          
        }
    else
        {       
            SentNumber++; //写在这里会发现,发送一个字节SentNumber值加2            
        }
}
void SerialSend(u8 xdata *buffer,u8 number)
{
        pSendBuffer = buffer;
        SentNumber = 0;
        REN = 0;
        while(SentNumber<number)
        {
            SBUF = pSendBuffer[SentNumber];
                while(TI==0);
                TI = 0;
            //  SentNumber++;   写在这里正常

        }
        REN = 1;       
}
2、测试发送一个字节到底进几次中断
上面代码不变;
void main(void)
{
        InitSerial();
        SentNumber = 0;
        SBUF = 0xaa;
        while(TI == 0);
        TI = 0;               
        while(1)
        {   
                if(SentNumber == 1) Led0 = 0;
                else if(SentNumber == 2) Led1 = 0;   //结果显示Led1亮       
        }
}

3、修改串口中断服务程序
更改为:
void isrSerial(void) interrupt 4
{
    if(RI)
        {
                RI = 0;
                RcvBuffer[RcvNumber++] = SBUF;       
                if (RcvNumber == RCVBUFLEN) RcvNumber = 0;                                  
        }
    else if(TI)  //就多了这一点代码,结果就一切正常
        {       
            SentNumber++; //写在这里会发现,发送一个字节SentNumber值加2            
        }
}

4、最后的测试代码

void isrSerial(void) interrupt 4
{
    if(RI)
        {
                RI = 0;
                RcvBuffer[RcvNumber++] = SBUF;       
                if (RcvNumber == RCVBUFLEN) RcvNumber = 0;                          
        }
    else if(TI)  
        {       
            SentNumber++;   
        }
    else  Led0 = 0;   //灯竟然会亮!!!神马原因??
}

相关帖子

沙发
asbsp23| | 2013-1-14 19:54 | 只看该作者
大侠,您的代码确定是全的?

使用特权

评论回复
板凳
ningling_21| | 2013-1-14 21:13 | 只看该作者
用中断发送和等待发送是有区别的,等待发送数据前,要先关闭串口中断...

使用特权

评论回复
地板
zhhbncwu| | 2013-1-14 21:59 | 只看该作者
弄清楚的办法及时自己单步调试看看

使用特权

评论回复
5
coody| | 2013-1-15 11:39 | 只看该作者
这类问题都是软件问题。LZ可以去STC的官网下册程序,“另一种风格的测试程序包”

使用特权

评论回复
6
lifeinjoy|  楼主 | 2013-1-15 19:52 | 只看该作者
asbsp23 发表于 2013-1-14 19:54
大侠,您的代码确定是全的?

已经删除任何多余代码,SentNumber这个变量只在中断中出现,这个可以放心

使用特权

评论回复
7
lifeinjoy|  楼主 | 2013-1-15 19:53 | 只看该作者
ningling_21 发表于 2013-1-14 21:13
用中断发送和等待发送是有区别的,等待发送数据前,要先关闭串口中断...

哦,还有这么一条,多谢多谢,我试一下

使用特权

评论回复
8
lifeinjoy|  楼主 | 2013-1-15 19:55 | 只看该作者
zhhbncwu 发表于 2013-1-14 21:59
弄清楚的办法及时自己单步调试看看

STC不支持在线调试,这个方法没法进行呀

使用特权

评论回复
9
lifeinjoy|  楼主 | 2013-1-15 19:56 | 只看该作者
coody 发表于 2013-1-15 11:39
这类问题都是软件问题。LZ可以去STC的官网下册程序,“另一种风格的测试程序包” ...

多谢提示,这就去

使用特权

评论回复
10
cjmqgsx| | 2013-5-2 14:51 | 只看该作者
ningling_21 发表于 2013-1-14 21:13
用中断发送和等待发送是有区别的,等待发送数据前,要先关闭串口中断...

今天无意中看到您的这句句话,解决了我一个**烦,也是关于串口中断的,这个是基础知识,但就是没记住,十分的感谢你。。。。:handshake

使用特权

评论回复
11
小小财迷| | 2013-7-7 20:21 | 只看该作者
大哥,你接收和发送怎么用的一个计数变量,中断进来一次当然是接收一个字节数据了

使用特权

评论回复
12
coody| | 2013-7-7 21:18 | 只看该作者
串口收或发一个字节只发生一次中断,这个是肯定的,无须置疑。

LZ的代码,接收中断RcvNumber++,发送中断也RcvNumber++,问题可能就在这里。MCU的表现,都是你代码的要求。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:一个努力的菜鸟,学习51单片机ing.....

0

主题

120

帖子

1

粉丝