找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4913|回复: 1
打印 上一主题 下一主题
收起左侧

求解释,485通信一次接收多个数据的中断怎么不能用?

[复制链接]
跳转到指定楼层
楼主
ID:59780 发表于 2014-5-7 14:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void ser() interrupt 4   //串行中断服务程序
{
unsigned char i,j,Check,tmp;
if(RI==1)      //接收标志位为1时,接收
  {
  RI=0;
  tmp=SBUF;  
  }
while(!RTUOverFlag)    //结束标志位为0时
  {   
  if(RTUStartFlag==0) //开始标志位为0时
   {
   if(tmp!='@')  //判断数据帧的起始位,不是@时不接收
    {
    RTUOverFlag=0;
    RTUStartFlag=0;        
    return;
    }     
   if(tmp=='@') //开始接收
    {
    UART_R_RTU[RTUPst]=tmp;  // 接收起始位
    RTUPst++;   
    RTUOverFlag=0;
    RTUStartFlag=1;//已接收起始位
    return;
    }
   }
  else    //接收剩余数据
   {
   if(tmp!='#') //接收结束位#之前的数据
    {
    UART_R_RTU[RTUPst]=tmp;
    RTUPst++;
    return;
    }
   else  //接收结束位#
    {                           
    UART_R_RTU[RTUPst]=tmp;
    RTUOverFlag=1; //完成接收,置标志位
    ES=0;   //关串口中断
    REN=0;   //不允许接收
    if(UART_R_RTU[1]!=ExtsAddr) //判断数据第二位是否与本机地址相同,如果不相同
     {
     for(j=0;j<10;j++)   //数据清零,标志位清零,允许接收,开串口中断
      UART_R_RTU[j]=0;
     RTUPst=0;
     RTUOverFlag=0;
     RTUStartFlag=0;
     REN=1;
     ES=1;
     return;
     }
    Check=0;  //初始化校验位
    RTUDataLen=UART_R_RTU[3]; //读数据长度
    for(i=0;i<3+RTUDataLen;i++)     //校验位
     {
     Check=Check+UART_R_RTU[i+1];
     }
    if(Check!=UART_R_RTU[RTUPst-1]) //判断校验位是否与接收到的数据中的校验位相同,如果不相同
     {
     for(j=0;j<10;j++)  //清零数据,清标志位,允许接收,开串口中断
      UART_R_RTU[j]=0;
     RTUPst=0;
     RTUOverFlag=0;
     RTUStartFlag=0;
     REN=1;
     ES=1;
     return;
     }
    else        //接收到完整数据情况下,置接收完成标志,清接收标志为下次接收做准备
     {     
     UARTRTUDataCheckedFlag=1;     
     RTUFunc=UART_R_RTU[2];
     RTUPst=0;
     RTUOverFlag=0;
     RTUStartFlag=0;
     REN=1;
     ES=1;
     return;
     }
    }
   }  
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:2318 发表于 2014-7-8 17:15 来自手机 | 只看该作者
你这个程序是不是只能接受第一个数据?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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