搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 2014-11-4 15:58:38 | 显示全部楼层 |阅读模式
今天用STC11F32XE调试串口程序,突然想到一个问题,于是做了如下实验:
实验目标:PC通过串口助手发送任意数据,单片机接收后返回给PC串口助手

程序两种写法:

第一种:

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

代码示意如下:

  1. void Uart_Isr() interrupt 4
  2. {
  3.    // static unsigned char n = 0;
  4.         if (RI)
  5.     {   
  6.                 RI = 0;
  7.                 uart_buf[0] = SBUF;
  8. //                delay(1000);
  9.                 SendData(uart_buf[0]);
  10. //                busy = 1;
  11.        
  12.     }
  13. }
复制代码



第二种:

串口中断函数里直接做标志位,busy = 1,在主函数while循环里检测标志位发送,代码示意如下:
  1. void Uart_Isr() interrupt 4
  2. {
  3.    // static unsigned char n = 0;
  4.         if (RI)
  5.     {   
  6.                 RI = 0;
  7.                 uart_buf[0] = SBUF;
  8. //                delay(1000);
  9. //                SendData(uart_buf[0]);
  10.                 busy = 1;
  11.        
  12.     }
  13. }

  14.         while(1)
  15.         {       
  16.                 //Breath_LED(800);
  17.                 if(busy == 1)
  18.                 {
  19.                         busy = 0;
  20. //                        delay(1000);                       
  21.                         SendData(uart_buf[0]);
  22.        
  23.                 }
  24.         }
复制代码


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

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

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

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

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


阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2014-11-4 16:05:55 | 显示全部楼层
延时如果短到一定的时间以下,就不会出现问题,所以要讨论的是这个问题出现的原因

出0入0汤圆

发表于 2014-11-4 16:07:07 | 显示全部楼层
中断里加这么长的延时啊,中断一般改变标志位,再在主函数中处理标志位

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2014-11-4 17:32:29 | 显示全部楼层
中断里延时不妥。

出0入0汤圆

发表于 2014-11-4 17:36:57 | 显示全部楼层
我觉得你在中断里弄这个delay(1000) ,1ms 还是1S ? 也许需要改改。。。

出0入0汤圆

发表于 2014-11-4 17:41:30 | 显示全部楼层
中断接收到数据压入缓冲区,如果超过一定时间没有其它数据,认为桢数据结束,立标志,出中断处理!

出0入0汤圆

发表于 2014-11-4 22:22:58 来自手机 | 显示全部楼层
加上fifo就可以了,之前写过这个。另外stc单片机串口是半双工,收发不能同时进行

出0入0汤圆

 楼主| 发表于 2014-11-4 22:24:22 | 显示全部楼层
第一种,中断方式,延时过长,只发送两个字符,从某个方面反映了,51中断能嵌套2层!?

出0入0汤圆

 楼主| 发表于 2014-11-4 22:28:51 | 显示全部楼层
第二种方式,延时过长,超过了数据发送时间。导致数据只发送最后一个!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表