打印

求大侠指点串口问题 while(1)在这不行

[复制链接]
2596|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiong57785|  楼主 | 2011-8-2 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
if语句在这用一个不行用两个就行
如果如下写 :(发送一个字符接收不了一个字符 )
//头文件
#include <regx52.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int

char a;

//-----------------------------------------------------------------------
//函数声明
void init();
//-----------------------------------------------------------------------


/************************************************************************

                                              主函数

*************************************************************************/
void main()
{
        init();       

                if(RI)
                {
                        a=SBUF;
                        RI=0;
                        SBUF=a;
                        while(!TI);
                        TI=0;
                        while(1);
                }


}
void init()
{
        TMOD=0X20;
        TH1=0XFD;
        TL1=0XFD;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
}

如果这么写如下 :(发送一个字符就能接收一个字符)

/************************************************************************

                                              主函数

*************************************************************************/
void main()
{
        init();       

                if(RI)
                {
                        a=SBUF;
                        RI=0;
                        SBUF=a;
                        while(!TI);
                        TI=0
                }

                if(RI)
                {
                        a=SBUF;
                        RI=0;
                        SBUF=a;
                        while(!TI);
                        TI=0;
                    while(1);       
                }

}

但如果这么写如下: (发送一个字符接收不了一个字符 )


/************************************************************************

                                              主函数

*************************************************************************/
void main()
{
        init();       

                if(RI)
                {
                        a=SBUF;
                        RI=0;
                        SBUF=a;
                        while(!TI);
                        TI=0
                }

                if(RI)
                {
                        a=SBUF;
                        RI=0;
                        SBUF=a;
                        while(!TI);
                        TI=0;
                          
                }
                 while(1);
}

求大侠指点 郁闷一上午了 另外SBUF到底能存几个字节   假如我把a设成 int型 是不是 程序还得该

相关帖子

沙发
joyme| | 2011-8-2 11:53 | 只看该作者
程序写的真极品
while(1)
{
    if(RI)
    {
            RI = 0;
            a = SBUF;
            SBUF = a;
        while(!Ti);
            TI = 0;
            //while(1);                如果不想继续接受发送就用这行代码
    }
}

使用特权

评论回复
板凳
gaohq| | 2011-8-2 12:20 | 只看该作者
哈哈,楼主初哥

使用特权

评论回复
地板
xiong57785|  楼主 | 2011-8-2 17:59 | 只看该作者
2楼大虾说的我明白   我是这样想的 : SBUF是8位的寄存器 ,而char类型的a又是一个8位即占一个字节的字符
这是不是就是说SBUF里只能存一个字节,即SBUF里存一个字节后就‘满了’,就会申请中断,置RI为1,我如果做这么一次   :         
                 if(RI)
                {
                        a=SBUF;
                        RI=0;
                        SBUF=a;
                        while(!TI);
                        TI=0
                        while(1);           //while(1)在此是为了让数据收发停止
                }
能不能就把a的值写入到SBUF中   也就是说串口助手发一个字符,就会接收一个字符。

还有写一个if不对是不是因为数据位是8位,但SBUF里还要存起始位和停止位    还要个疑问SBUF什么时候开始接收下一个数据,是在RI=0之后吗?  还是在a=SBUF之后 ?(即把SBUF数据读取完之后)  第一次发帖 有点手抖 :(  哪里不对还望大虾指点 洗耳恭听

使用特权

评论回复
5
joyme| | 2011-8-2 18:21 | 只看该作者
这样写串口助手发一个数据就能接到一个数据,之后就停止了,不用while(1)就能不停的发送、接收
SBUF是硬件接收完一个字节后缓存的,SBUF也不存起始位和停止位,跟你处理不处理没有关系,如果你没来得及处理又接收到新的数据,那么SBUF会被刷新成新的数据。
UART模块处理有移位寄存器用来控制发送和接收,SBUF只是缓存,想要响应及时必须用中断模式并视需要用些缓存

使用特权

评论回复
6
xiong57785|  楼主 | 2011-8-2 20:21 | 只看该作者
想了一下午 好像有点头绪了 程序1之所以没有达到“发送一个字符就能接收一个字符”的目的是因为RI还没有置位完就到程序末尾了 程序又开始复位从头开始,又没有RI置位即SBUF满(因为时间不够),根据这个我加了一个while(!RI),程序如下所示:
/************************************************************************

                                              主函数

*************************************************************************/
void main()
{
        init();        
       while(!RI);//判断是否接收完了。
                if(RI)
                {
                        a=SBUF;
                        RI=0;
                        SBUF=a;
                        while(!TI);
                        TI=0;
                        while(1);
                }


}结果证明这样就达到了预期的目的   但是程序2和程序3我还是解释不了   我还有个问题:根据5楼大虾的说法 :如果你没来得及处理又接收到新的数据,那么SBUF会被刷新成新的数据。

使用特权

评论回复
7
xiong57785|  楼主 | 2011-8-2 20:30 | 只看该作者
希望大虾能给例子 证明:如果你没来得及处理又接收到新的数据,那么SBUF会被刷新成新的数据

使用特权

评论回复
8
xiong57785|  楼主 | 2011-8-3 08:11 | 只看该作者
程序2和3我知道哪里错了  程序2对是因为两个IF能达到RI置位的时间,而且程序还一直复位又开始执行,所以可以发一个字符收一个字符,而程序3下载后马上会停到while(1);中 ,不在进行别的事。 哎 !丢人啊  5楼大虾说的我昨晚想了一下写了个程序证明他是对的 如下 :
//头文件
#include <regx52.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int


char a;

//-----------------------------------------------------------------------
//函数声明
void init();
void delay(uint z);
//-----------------------------------------------------------------------


/************************************************************************

                                              主函数

*************************************************************************/
void main()
{
        init();       
        while(1);  
}
void init()
{
        TMOD=0X20;
        TH1=0XFD;
        TL1=0XFD;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
}

void  ser() interrupt 4
{
        ES=0;
        if(RI)
        {
                RI=0;
                  delay(1000);   //等待SBUF被刷新
                a=SBUF;
                SBUF=a;
                while(!TI);
                TI=0;
        }
        ES=1;

}

void delay(uint z)                        //延时1ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);


}
当用助手发送MN的时候过1s钟后回来的只有N这就证明SBUF被刷新了   至于a由char类型换成int 类型为什么也能成功,原因应该是串口助手的问题,因为其发送要不是字符形式要不是十六进制 所以就把int当中char类型了  不知道我理解的对不对

使用特权

评论回复
9
yewuyi| | 2011-8-3 08:28 | 只看该作者
UART通信请使用中断,并且需要是一个无阻塞的程序结构。


LZ贴的所有代码都是没有实际价值的,请自己查阅相关资料中的UART应用代码到底如何使用。

使用特权

评论回复
10
ssy250| | 2011-8-3 08:44 | 只看该作者
while(1),传说的死循环?

使用特权

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

本版积分规则

7

主题

55

帖子

2

粉丝