利用状态机来遍历FLASH取出指定数据

2018-01-31  本文已影响0人  EVE0430

参考资料:
http://blog.csdn.net/v__king__/article/details/71740492 [状态机实现的三种方法-C语言]
http://blog.csdn.net/findaway123/article/details/16870927有限状态机在程序设计中作用和意义

为什么要用状态机,状态机常用于哪里

1.过多的if else带来结构的过于复杂
2.改变传统的'遵循事先设定的逻辑,从头到尾地执行',可以处理任何顺序的事件,并能提供有意义的响应——即使这些事件发生的顺序和预计的不同。有限状态机正是为了满足这方面的要求而设计的。
3.各种通信协议发送方和接受方传递数据时,一个字节一个字节接收比对(下例类似)
4.自底向上解析语法的parser
5.饮料机(数电课本)
6.正则中关键字过滤,可以用有限自动机推导正则表达式

说了这么多,看看实例吧
实例:从FLAG中取出想要的那一帧数据

void found()
{  unsigned char myptr=0;
 int mypage=256;
 unsigned char i =0;
 unsigned char my_tx_buffer[170];
 unsigned char want_day[6];//年
 unsigned char address[6];
 unsigned char cur_state=0;
 unsigned char nxt_state=0;
   for(unsigned i=0;i<170;i++)
     my_tx_buffer[i]=0;
 //如果我要找2018年1月31日12点24分24秒的信息  
     want_day[0]=0x19;
     want_day[1]=0x01;
     want_day[2]=0x31;
     want_day[3]=0x12;
     want_day[4]=0x24;
     want_day[5]=0x24;
     //
     mypage=256;  //数据存于256页至1024页
     while(1)
  {   
        ReadMemory(address,6,mypage,myptr);  //于mypage页myptr字节处读取至address
        cur_state = nxt_state;   
 switch(cur_state) //状态0,刚进入查询
     {            
       case 0: //在s0状态   
       if(address[0]==want_day[0]) //如果年份一样,那么就执行a1动作,并将状态转移到s1态; 
       { nxt_state = 1; }
         else
         break; 
      case 1: //在s1状态
       if(address[1]==want_day[1]) //如果月份符合 
       { nxt_state = 2; }           
        else
          break;       
      case 2: //在s2状态
       if(address[2]==want_day[2]) //如果日符合            
       {nxt_state = 3;}     
       else
         break;
       
       case 3: //在s3状态  符合数据 取出并保存
       for( i=0;i<6;i++)
         my_tx_buffer[i]=address[i];
         nxt_state = 0 ;
         goto solve;
       
       default:break;
}
myptr+=73;
if(myptr>73)
{myptr=0;
mypage++;
}   
if(mypage>1024)
{
 mypage=256;
 goto solve;
}
}   
solve:  //后续处理     

     myptr=0;

}
上一篇下一篇

猜你喜欢

热点阅读