打印

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

[复制链接]
961|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
花花点子|  楼主 | 2016-6-17 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想编一个程序,需求是这样的(我用的msp430f448)
上电后485每隔10S问询一次设备,设备正常回复后每隔1s问询一次设备,如果485询问设备,设备不回复,再询问3次,如果设备不回复则,继续每隔10s询问一次。
我写的代码如下:(因为逻辑就在这两个中断内,我就贴了这两个中断其他的无关痛痒,寄存器配置也没问题)现在这一段代码能实现,每隔10s询问,设备正常回复后每隔1s询问一次, 但是后面的“ 每隔1s询问后 若设备不回复,再询问3次,如果设备不回复则,继续每隔10s询问一次。”这个功能始终实现不了,我知道是因为 我的flag_Receive这个总置一  我现在有点想不出 另一个方法了,被自己绕里边了 ,希望各位高手拔刀相助!
#pragma vector=BASICTIMER_VECTOR  
__interrupt   void BT_ISR(void)
{
  
  if(flag_Receive==1)
  {
     timer1s=1;
     //un_receive++;
     
     if(timer1s==1)
       {
         
         timer1s=0;
         Ask485_1s(Data_tools,Data_length);
         
         
       }
  }
  if(flag_Receive==0)
  {
     timer10s++;
     
     if(timer10s==10)
     {
      
         
         timer10s=0;
         Ask485_10s(Data_tools,Data_length);
      
     }
  }
     
  
  
  
}
#pragma vector=USART1RX_VECTOR
__interrupt void uart1_rx (void)
{

  uint8 i;
  
  temp=U1RXBUF;
    for(i=0;i<=7;i++)  //以队列的方式将接受的数据传入数组 先进先出 后进后出
                   {
                      Data_flowmeter[i]= Data_flowmeter[i+1];
     
                   }
             Data_flowmeter[8]=temp;
  

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

   Receive_from_flowmeter(Data_flowmeter);
   flag_Receive=1;


}


相关帖子

沙发
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
我觉得我写的这个程序的 逻辑有问题  您有没有其他的思路能指点一下吗

先把流程图整清楚,画出来,问题或许就迎仞而解了

使用特权

评论回复
5
dirtwillfly| | 2016-6-17 16:42 | 只看该作者
如果是我写程序,我会把状态转移放在main函数里,定时器只定时1秒,串口中断只负责串口发送和接收数据
先画流程图捋捋逻辑关系吧,不要懒得画

使用特权

评论回复
6
nethopper| | 2016-6-17 17:16 | 只看该作者
只看到flag_Receive=1,没看到flag_Receive=0,也没看到再询问3次的代码,什么情况?

使用特权

评论回复
7
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);
  }
  
}

使用特权

评论回复
8
zyj9490| | 2016-6-17 23:28 | 只看该作者
你要画状态机,每个状态怎么切换的机理没有明晰,只知道一个状态的动作而已。认为这是很简单的一个流程,定时器,加主循环处理。定时中断,主循环状态判断,状态输出。数据处理。

使用特权

评论回复
9
sjssjssjs| | 2016-6-18 14:43 | 只看该作者
我觉得也应该先画个图之类的,捋清楚之后再coding

使用特权

评论回复
10
yubsh| | 2016-6-18 15:02 | 只看该作者
最好的作法是状态机。用一个定时器检测通讯超时。

使用特权

评论回复
11
gaoqianzhe| | 2016-6-19 23:35 | 只看该作者
中断里做的事越少越好,把其它的逻辑或者判断放到外面

使用特权

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

本版积分规则

2

主题

5

帖子

0

粉丝