一个关于逻辑的问题,被自己绕里边了,请教一下各位。

[复制链接]
1524|10
 楼主| 花花点子 发表于 2016-6-17 16:06 | 显示全部楼层 |阅读模式
想编一个程序,需求是这样的(我用的msp430f448)
上电后485每隔10S问询一次设备,设备正常回复后每隔1s问询一次设备,如果485询问设备,设备不回复,再询问3次,如果设备不回复则,继续每隔10s询问一次。
我写的代码如下:(因为逻辑就在这两个中断内,我就贴了这两个中断其他的无关痛痒,寄存器配置也没问题)现在这一段代码能实现,每隔10s询问,设备正常回复后每隔1s询问一次, 但是后面的“ 每隔1s询问后 若设备不回复,再询问3次,如果设备不回复则,继续每隔10s询问一次。”这个功能始终实现不了,我知道是因为 我的flag_Receive这个总置一  我现在有点想不出 另一个方法了,被自己绕里边了 ,希望各位高手拔刀相助!
  1. #pragma vector=BASICTIMER_VECTOR  
  2. __interrupt   void BT_ISR(void)
  3. {
  4.   
  5.   if(flag_Receive==1)
  6.   {
  7.      timer1s=1;
  8.      //un_receive++;
  9.      
  10.      if(timer1s==1)
  11.        {
  12.          
  13.          timer1s=0;
  14.          Ask485_1s(Data_tools,Data_length);
  15.          
  16.          
  17.        }
  18.   }
  19.   if(flag_Receive==0)
  20.   {
  21.      timer10s++;
  22.      
  23.      if(timer10s==10)
  24.      {
  25.       
  26.          
  27.          timer10s=0;
  28.          Ask485_10s(Data_tools,Data_length);
  29.       
  30.      }
  31.   }
  32.      
  33.   
  34.   
  35.   
  36. }
  37. #pragma vector=USART1RX_VECTOR
  38. __interrupt void uart1_rx (void)
  39. {

  40.   uint8 i;
  41.   
  42.   temp=U1RXBUF;
  43.     for(i=0;i<=7;i++)  //以队列的方式将接受的数据传入数组 先进先出 后进后出
  44.                    {
  45.                       Data_flowmeter[i]= Data_flowmeter[i+1];
  46.      
  47.                    }
  48.              Data_flowmeter[8]=temp;
  49.   

  50.   if((Data_flowmeter[0]==0xff)&&(Data_flowmeter[1]==0x03)&&(Data_flowmeter[2]==0x04))
  51. {

  52.    Receive_from_flowmeter(Data_flowmeter);
  53.    flag_Receive=1;


  54. }


dirtwillfly 发表于 2016-6-17 16:19 | 显示全部楼层
你画个流程图就明白怎么实现了
 楼主| 花花点子 发表于 2016-6-17 16:35 | 显示全部楼层
dirtwillfly 发表于 2016-6-17 16:19
你画个流程图就明白怎么实现了

我觉得我写的这个程序的 逻辑有问题  您有没有其他的思路能指点一下吗
ningling_21 发表于 2016-6-17 16:40 | 显示全部楼层
花花点子 发表于 2016-6-17 16:35
我觉得我写的这个程序的 逻辑有问题  您有没有其他的思路能指点一下吗

先把流程图整清楚,画出来,问题或许就迎仞而解了
dirtwillfly 发表于 2016-6-17 16:42 | 显示全部楼层
如果是我写程序,我会把状态转移放在main函数里,定时器只定时1秒,串口中断只负责串口发送和接收数据
先画流程图捋捋逻辑关系吧,不要懒得画
nethopper 发表于 2016-6-17 17:16 | 显示全部楼层
只看到flag_Receive=1,没看到flag_Receive=0,也没看到再询问3次的代码,什么情况?
richard02 发表于 2016-6-17 18:04 | 显示全部楼层
这样子改一下,应该就好了:
__interrupt   void BT_ISR(void)
{
  
  if(flag_Receive==1)
  {
     flag_Receive=0;
     timer1s=1;
     timer10s=0;
     //un_receive++;
     
  }
  else
  {
     timer10s++;
     
     if(timer10s>2)
     {
        timer1s=0;
        if(timer10s==10)
        {
            timer10s=0;
            Ask485_10s(Data_tools,Data_length);
        }
     }
  }

  if(timer1s==1)
  {
    timer1s=0;
    Ask485_1s(Data_tools,Data_length);
  }
  
}
zyj9490 发表于 2016-6-17 23:28 | 显示全部楼层
你要画状态机,每个状态怎么切换的机理没有明晰,只知道一个状态的动作而已。认为这是很简单的一个流程,定时器,加主循环处理。定时中断,主循环状态判断,状态输出。数据处理。
sjssjssjs 发表于 2016-6-18 14:43 来自手机 | 显示全部楼层
我觉得也应该先画个图之类的,捋清楚之后再coding
yubsh 发表于 2016-6-18 15:02 | 显示全部楼层
最好的作法是状态机。用一个定时器检测通讯超时。
gaoqianzhe 发表于 2016-6-19 23:35 | 显示全部楼层
中断里做的事越少越好,把其它的逻辑或者判断放到外面
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部