找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1467|回复: 8
收起左侧

请教单片机串口通讯问题,最后置标志位语句不是每次都能执行

[复制链接]
ID:565803 发表于 2019-6-18 16:03 | 显示全部楼层 |阅读模式

用C8051F410, 需要从串口接收两个字节,收到后置标志位,程序如下

vvoid comm0_rx(void) interrupt 4   

{

        m=0;

  while(m<2)

   {

          if(RI0)                  

         {

            RI0=0;                  

            recdata[m]=SBUF0;

           m++;

         }

     }

        

              m=0;

       while(m<2)               

           {

                  SBUF0=recdata[m];

                    while(!TI0);           

                    TI0=0;               

                   m++;

           }

            flag0=1;        

            flag1=1;        

           ES0=0;                 

}

     程序运行后,接收及发送都没问题,但就是最后置标志位语句不是每次都能执行,偶尔接收一次就能执行,大多数要接收好几次才能置位(次数不定)。开始时接收和发送是在一起,后来分开,甚至置位语句放在接收与发送之间也没用。哪位大侠遇到过这种问题?

   

回复

使用道具 举报

ID:94031 发表于 2019-6-19 08:14 | 显示全部楼层
不能把中断处理程序搞得这么复杂,会影响串口接收的,中断里设标志,复杂处理中断外执行。
回复

使用道具 举报

ID:10947 发表于 2019-6-19 10:14 | 显示全部楼层
因为你有好几个判断,满足了判断条件才会执行到最后,间隔时间相对来说很长了
回复

使用道具 举报

ID:565803 发表于 2019-6-19 10:26 | 显示全部楼层
xuyaqi 发表于 2019-6-19 08:14
不能把中断处理程序搞得这么复杂,会影响串口接收的,中断里设标志,复杂处理中断外执行。

已经尽力精简了,收到数据后置标志位,然后禁止串口通信,主程序执行完相应的任务后再重开串口
回复

使用道具 举报

ID:565803 发表于 2019-6-19 10:29 | 显示全部楼层
xuyaqi 发表于 2019-6-19 08:14
不能把中断处理程序搞得这么复杂,会影响串口接收的,中断里设标志,复杂处理中断外执行。

不管中断程序效率如何,总不能漏掉语句吧,这才是我不理解的地方
回复

使用道具 举报

ID:94031 发表于 2019-6-19 11:07 | 显示全部楼层
liuzanshui 发表于 2019-6-19 10:26
已经尽力精简了,收到数据后置标志位,然后禁止串口通信,主程序执行完相应的任务后再重开串口

“收到数据后置标志位,然后禁止串口通信”怎么能禁止串口通信,对方发送你不是漏掉了嘛,你应该在接收中断里照章全收,在中断外处理这样才不会漏数据。
回复

使用道具 举报

ID:565803 发表于 2019-6-19 13:20 | 显示全部楼层
xuyaqi 发表于 2019-6-19 11:07
“收到数据后置标志位,然后禁止串口通信”怎么能禁止串口通信,对方发送你不是漏掉了嘛,你应该在接收中 ...

开始是将ES0=0语句放在中断外,现在放在中断的结尾,结果都一样。我是先接收和发送完数据,退出中断前禁止串口
回复

使用道具 举报

ID:123289 发表于 2019-6-19 15:50 | 显示全部楼层
你能照着沙发的意义去做,脑子就够用了。
你自己把你现在的程序画成流程图看看,走得通走不通?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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