关于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)在中断函数里的位置不同,错误现象也不同
希望对硬件底层比较了解的高手帮忙解释一下原因,普及一下,串口接收中断的操作方式;
延时如果短到一定的时间以下,就不会出现问题,所以要讨论的是这个问题出现的原因 中断里加这么长的延时啊,中断一般改变标志位,再在主函数中处理标志位 第一种方式,应该只会收到 12 吧?51的串口没有FIFO,数据进来后就要赶紧收走否则会被下一笔数据取代。 slotg 发表于 2014-11-4 16:27
第一种方式,应该只会收到 12 吧?51的串口没有FIFO,数据进来后就要赶紧收走否则会被下一笔数据取代。 ...
第一种方式能收到前两组数,这个想通了,是因为51单品片只允许二级中断嵌套的原因 中断里延时不妥。 我觉得你在中断里弄这个delay(1000) ,1ms 还是1S ? 也许需要改改。。。 中断接收到数据压入缓冲区,如果超过一定时间没有其它数据,认为桢数据结束,立标志,出中断处理! 加上fifo就可以了,之前写过这个。另外stc单片机串口是半双工,收发不能同时进行 第一种,中断方式,延时过长,只发送两个字符,从某个方面反映了,51中断能嵌套2层!? 第二种方式,延时过长,超过了数据发送时间。导致数据只发送最后一个!
页:
[1]