leiyin 发表于 2014-11-4 15:58:38

关于51单片机串口的问题,求高手帮忙解释解释

今天用STC11F32XE调试串口程序,突然想到一个问题,于是做了如下实验:
实验目标:PC通过串口助手发送任意数据,单片机接收后返回给PC串口助手

程序两种写法:

第一种:

在串口接收中断函数里,直接发送接收到数据,测试没有问题,无论发单个数据和多个数据都能准备返回;

代码示意如下:

void Uart_Isr() interrupt 4
{
   // static unsigned char n = 0;
        if (RI)
    {   
                RI = 0;
                uart_buf = SBUF;
//                delay(1000);
                SendData(uart_buf);
//                busy = 1;
       
    }
}



第二种:

串口中断函数里直接做标志位,busy = 1,在主函数while循环里检测标志位发送,代码示意如下:
void Uart_Isr() interrupt 4
{
   // static unsigned char n = 0;
        if (RI)
    {   
                RI = 0;
                uart_buf = SBUF;
//                delay(1000);
//                SendData(uart_buf);
                busy = 1;
       
    }
}

        while(1)
        {       
                //Breath_LED(800);
                if(busy == 1)
                {
                        busy = 0;
//                        delay(1000);                       
                        SendData(uart_buf);
       
                }
        }

测试也能完成,发送单个数据和多个数据都能准确返回给PC。

2、上述代码中,如果加上那个延时delay(1000);之后,就会出现问题,发送多个数据时,不能够准确返回。

第一种方式,加上延时后,如果发送 12 13 14 三个数据,则只能返回 12 13 两个数据
第二种方式,加上延时后,如果发送 12 13 14 三个数据,则只能返回 14 一个数据

第二种方式,出现问题,可能好理解,但是第一种方式,为什么也会出现问题,第一种方式中delay(1000)在中断函数里的位置不同,错误现象也不同

希望对硬件底层比较了解的高手帮忙解释一下原因,普及一下,串口接收中断的操作方式;


leiyin 发表于 2014-11-4 16:05:55

延时如果短到一定的时间以下,就不会出现问题,所以要讨论的是这个问题出现的原因

Gallen.Zhang 发表于 2014-11-4 16:07:07

中断里加这么长的延时啊,中断一般改变标志位,再在主函数中处理标志位

slotg 发表于 2014-11-4 16:27:33

第一种方式,应该只会收到 12 吧?51的串口没有FIFO,数据进来后就要赶紧收走否则会被下一笔数据取代。

leiyin 发表于 2014-11-4 16:37:19

slotg 发表于 2014-11-4 16:27
第一种方式,应该只会收到 12 吧?51的串口没有FIFO,数据进来后就要赶紧收走否则会被下一笔数据取代。 ...

第一种方式能收到前两组数,这个想通了,是因为51单品片只允许二级中断嵌套的原因

wxtypeng 发表于 2014-11-4 17:32:29

中断里延时不妥。

markdif 发表于 2014-11-4 17:36:57

我觉得你在中断里弄这个delay(1000) ,1ms 还是1S ? 也许需要改改。。。

xiaodao35 发表于 2014-11-4 17:41:30

中断接收到数据压入缓冲区,如果超过一定时间没有其它数据,认为桢数据结束,立标志,出中断处理!

fancyboy 发表于 2014-11-4 22:22:58

加上fifo就可以了,之前写过这个。另外stc单片机串口是半双工,收发不能同时进行

leiyin 发表于 2014-11-4 22:24:22

第一种,中断方式,延时过长,只发送两个字符,从某个方面反映了,51中断能嵌套2层!?

leiyin 发表于 2014-11-4 22:28:51

第二种方式,延时过长,超过了数据发送时间。导致数据只发送最后一个!
页: [1]
查看完整版本: 关于51单片机串口的问题,求高手帮忙解释解释