参考资料:
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;
}
网友评论