打印

我的程序怎么进到中断里出不来了,大家帮我看看

[复制链接]
1586|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
冰冷的游客|  楼主 | 2014-7-8 16:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//发送数据
void USCIA0_Send(char *p_data,unsigned int i_length,unsigned int i_time)
{
    unsigned  int i_ctr = 0;
   
    S_Assist.C_CircutBusyFlag = 1;
    USCIA0_TX_EN;
    Delayms(1);
    S_HartData.I_RxCtr = 0;
    S_HartData.I_RxTotalCtr = 0;
    S_HartData.C_RxOK = 0;
    S_HartData.I_TxCtr = 0;
    S_HartData.C_TxOK = 0;
    S_HartData.I_TxTotalCtr = i_length+4;
    memset(&S_HartData.C_TxBuf[0],0xFF,4);
    memcpy(&S_HartData.C_TxBuf[4],p_data,i_length);
    UCA0TXBUF =  S_HartData.C_TxBuf[0];
    do
    {
        i_ctr++;
    }while(!S_HartData.C_RxOK && i_ctr<=i_time);
    S_Assist.C_CircutBusyFlag = 0;
}

#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{         
  
      if(S_HartData.I_TxCtr >= S_HartData.I_TxTotalCtr)
      {
          S_HartData.I_TxCtr = 0;
          S_HartData.I_TxTotalCtr = 0;
         
          S_HartData.C_TxOK = 1;
         

      }
      else
      {
          S_HartData.I_TxCtr++;
          UCA0TXBUF = S_HartData.C_TxBuf[S_HartData.I_TxCtr];
      }
     if(S_HartData.C_TxOK == 1)
      {
          if(++S_HartData.C_ModbusTxCtr >= 6)
          {
              USCIA0_RX_EN;
              S_HartData.C_ModbusTxCtr = 0;
              S_HartData.C_TxOK = 0;
          }
      }

}

unsigned char C_Rx_FF_Ctr = 0;
unsigned char C_Rx_Total_Ctr = 0;

//--接收中断函数----
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  
  
  unsigned char c_rx = 0;
  
  c_rx = UCA0RXBUF;

  if(c_rx == 0xFF)
  {
      if(++C_Rx_FF_Ctr >= 3)
      {
          S_HartData.I_RxCtr = 0;
          C_Rx_Total_Ctr = 0xFF;
          S_HartData.C_RxHead = 1;
      }
  }
  else
  {
      C_Rx_FF_Ctr = 0;
  }
  
  if(S_HartData.C_RxHead == 1)
  {
      if(c_rx == 0x02 || c_rx == 0x82)
      {
          S_HartData.C_RxHead = 2;
          S_HartData.I_RxCtr = 0;
          S_HartData.C_RxBuf[S_HartData.I_RxCtr++] = c_rx;
      }
      else
      {
          if(c_rx == 0xFF)
          {
              C_Rx_FF_Ctr++;
          }
          else
          {
              C_Rx_FF_Ctr = 0;
              S_HartData.C_RxHead = 0;
          }
      }
  }
  else if(S_HartData.C_RxHead == 0x02)
  {
      S_HartData.C_RxBuf[S_HartData.I_RxCtr++] = c_rx;
      if(S_HartData.C_RxBuf[0] == 0x02)
      {
        if(S_HartData.I_RxCtr >= 4)
        {
            if(C_Rx_Total_Ctr == 0xFF)
            {
                C_Rx_Total_Ctr = S_HartData.C_RxBuf[3]+5;
            }
        }
      }
      else
      {
        if(S_HartData.I_RxCtr >= 8)
        {
            if(C_Rx_Total_Ctr == 0xFF)
            {
                C_Rx_Total_Ctr = S_HartData.C_RxBuf[7]+9;
            }
        }
      }
      
      if(S_HartData.I_RxCtr >= C_Rx_Total_Ctr)
      {
          C_Rx_FF_Ctr = 0;
          S_HartData.C_RxHead = 0;
          S_HartData.I_RxTotalCtr = S_HartData.I_RxCtr;
          S_HartData.C_RxOK = 1;
      }
  }
}

相关帖子

沙发
冰冷的游客|  楼主 | 2014-7-8 16:21 | 只看该作者
发送完数据后就一直在接收中断里循环,我怎么才能让他跳出来,等有数据来的时候再进来。

使用特权

评论回复
板凳
dirtwillfly| | 2014-7-8 20:51 | 只看该作者
可以把中断里的部分代码移到主函数里,只留必要的代码。
循环可以放到main函数中

使用特权

评论回复
地板
冰冷的游客|  楼主 | 2014-7-9 08:39 | 只看该作者
dirtwillfly 发表于 2014-7-8 20:51
可以把中断里的部分代码移到主函数里,只留必要的代码。
循环可以放到main函数中 ...

我试试

使用特权

评论回复
5
冰冷的游客|  楼主 | 2014-7-9 09:46 | 只看该作者
冰冷的游客 发表于 2014-7-9 08:39
我试试

还有其他方法吗

使用特权

评论回复
6
冰冷的游客|  楼主 | 2014-7-9 09:47 | 只看该作者
dirtwillfly 发表于 2014-7-8 20:51
可以把中断里的部分代码移到主函数里,只留必要的代码。
循环可以放到main函数中 ...

还有其他方法吗

使用特权

评论回复
7
dirtwillfly| | 2014-7-9 11:50 | 只看该作者
冰冷的游客 发表于 2014-7-9 09:47
还有其他方法吗

优化你中断服务程序里的循环,没必要进行循环时就跳出循环。
主要是减少中断服务程序的执行时间

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

75

帖子

0

粉丝