如何在单片机上实现有限状态机:在单片机通讯程序中我们经常会遇到一定的数据帧格式,串口通讯时每个嵌入式学习人员的必修课,以下我以我的方法简单的阐述以下有限状态机载单片机串口通讯中解析数据包头 假设协议包头定义为 AA, AA, 地址高位,地址低位,数据。。。。。。通波命令为AA, AA, ff,ff,数据。。。。。。我们通过有限状态机的方法来把帧数据进行分解。状态定义为s0,s1,s2,s3,s4 cur_status=s0初始化赋值,以后进行状态的迭代,以下为有限状态机在串口通讯程序中的应用程序,应该看的很明白了,这里就不画状态图进行解释,如果有不明白的我可以画出状态图进行解释,有限状态机的实现,有限状态机可以应用与红外解码。。。。各种应用场合,在设计的时候只要画出状态图,写程序的时候就可以得心应手了。
__interrupt void USCI_A0_ISR(void){
if(UCA0IFG & UCRXIFG){
RX_BUF = UCA0RXBUF; // 发送接收到的数据
rec_overrun=dly2;
work.f1=1;
if(CSTATUS.f7==1){
return;}
cur_status=nxt_status;
switch(cur_status){
case s0:
if(RX_BUF==0XAA){
nxt_status=s1;}
else{
nxt_status=s0;}
break;
case s1:
if(RX_BUF==0XAA){
nxt_status=s2;}
else{
commerr();
nxt_status=s0;}
break;
case s2:
if(RX_BUF==0XAA){
nxt_status=s2;}
else if(RX_BUF==ADDRH){
nxt_status=s3;}
else if(RX_BUF==0xff){
CSTATUS.f2=1;
nxt_status=s3;
}
else{
nxt_status=s0;}
break;
case s3:
if(RX_BUF==ADDRL){
nxt_status=s4;
RCpoint=rxbuff;}
else if(RX_BUF==0xff){
CSTATUS.f4=1;
nxt_status=s4;
RCpoint=rxbuff;
}
else{
nxt_status=s0;}
break;
case s4:
*RCpoint++=RX_BUF;
RXWORDS++;
break;
}
}
}
//////////////////////////////////版权所有,如需转载注明出处 鱼香茄子/////////////////////////////////////////////
文章评论(0条评论)
登录后参与讨论