打印

脑浆不够用,寻求理论、方**上的帮助。

[复制链接]
楼主: qihao
手机看帖
扫描二维码
随时随地手机跟帖
41
HWM| | 2007-11-21 13:21 | 只看该作者 回帖奖励 |倒序浏览

如果变长就加个结束标志,不建议采用数据长度。

另外状态机最好是优化一下,特别是当状态较多的时候。

使用特权

评论回复
42
dld2| | 2007-11-21 14:19 | 只看该作者

LS: 结束标志可能会和参数内容相同。

我一般都是又有参数长度,又有结束标志。

使用特权

评论回复
43
HWM| | 2007-11-21 14:24 | 只看该作者

楼上:那是你状态机设计(或“语法”设计)的问题,

仔细想想为何?

使用特权

评论回复
44
dld2| | 2007-11-21 14:38 | 只看该作者

我说的是通讯协议,与状态机没有关系啊

比如数据中有一个32bit整数,怎么避开结束标志?

使用特权

评论回复
45
HWM| | 2007-11-21 15:41 | 只看该作者

to 44楼:如果在语法中(就是你所谓的协议)没有循环嵌套定

甚至连结束标志都可以不用。

至于如果有不定长数据传输,则可在数据段首单元定义一个数据长度,后面再跟相应数量的数据即可。

使用特权

评论回复
46
dld2| | 2007-11-21 16:05 | 只看该作者

楼上在说编译原理了

嘿嘿。简单用用,没那么复杂。

使用特权

评论回复
47
dld2| | 2007-11-21 16:48 | 只看该作者

ZT:

“有限状态机FSM思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软件上称为FMM--有限消息机)。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。”

使用特权

评论回复
48
yewuyi| | 2007-11-21 17:20 | 只看该作者

0XFF,0X55,长度,数据1~N,校验

0XFF,0X55,长度,数据1~N,校验

使用特权

评论回复
49
qihao|  楼主 | 2007-11-21 19:26 | 只看该作者

~

“有限状态机FSM思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软件上称为FMM--有限消息机)。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。”

    赞一个!是设计之理论依据----“变连续处理为离散数字处理”。接下来还因该讨论实现方法上的具体写法。

更关键是,常写程序,我是几年没写程序了,陡然来这么一下,脑袋很直了!

    至于串口通信, 加上“长度” 和“报文结束”标志吧,便于程序设计,通信健壮性、 可扩展性都有好处。




感谢各位把我这楼房修到48楼了~

使用特权

评论回复
50
HWM| | 2007-11-21 22:09 | 只看该作者

其实很简单,如果所谓协议的拓扑结构能呈树状,虽然是不

只要无二意(最终点在叶子上),就存在着一个具有相同拓扑结构的状态机与之对应。其状态机能解出遵循此协议信息的所有含义,而且还能检测其错误。

至于状态机的实现,方法有多种多样,可以是纯程序分支的或纯数据结构的或对象处理法等。

当然,如果是非树结构,则可能存在有限环或无限环。对于有限环可以引入长度参数并用循环来解释,而对与无限环则可引入环的结束标志来导出解释。

另外如果存在协议的递归定义则情况就复杂了,不在此论述。

使用特权

评论回复
51
qihao|  楼主 | 2007-11-21 22:43 | 只看该作者

呵呵 HWM

前面几位兄弟和我都还远没有进入到非树结构阶段,所说的还是乒乓协议形式。

使用特权

评论回复
52
and| | 2007-11-22 09:27 | 只看该作者

有一本书,叫做《计算理论导引》

读过第一部分,你的问题全都解决了。

使用特权

评论回复
53
qihao|  楼主 | 2007-11-22 10:33 | 只看该作者

遇到这些科班的 要读《计算理论导引》

 感觉自己就一农民~  不过这里的菜农厉害,连农民也不敢自称了~

(不好意思,对不起真农民兄弟了)


状态机其实无所不在,关键看设计和应用水平了。

使用特权

评论回复
54
HWM| | 2007-11-22 10:42 | 只看该作者

有空可以看看,当然“科班的”就当复习啦。

使用特权

评论回复
55
qihao|  楼主 | 2007-11-22 20:21 | 只看该作者

~

此路通否:          if
左还是右呢?:      if  else
KAO 走那条路哦!    switch 

??

不过要有HWM 的函数思想就进一步了

??

使用特权

评论回复
56
thankw| | 2007-11-22 22:49 | 只看该作者

其实很简单,希望你耐心看再看数再仔细想再实践下

你明白指向函数的指针就会写了,其实并不难的,核心的就是下面两个数据结构。
/*
    菜单结构体
    1.    2.   3.  键值处理函数
    内核
*/
typedef struct 
{
      void  (* Key1Function) (void);
      void  (* Key2Function) (void);
      void  (* Key3Function) (void);
      
      void  (* CoreFunction) (void);
}StateDef;

//结构体数组
StateDef code State[31]=
{
     /*0*/    {  NULL  ,  NULL  ,  NULL  ,  NULL },
          /*1*/    
            .{  Key1State1 , Key2State1 , 
           Key3State1 , CoreState1 },
            .
            .
          /*30*/.............................
};
按照上面的数据结构,多少状态都放的下(MCU ROM范围内),注意两点,一状态切换时候变量,标志的清零,以及外部函数的调用,另外使用上面的结构以后程序增加新的函数也很方便的,写好的函数只要往结构体数组添加就可以了。

main函数执行的时候象下面这样写就可以了。
void main (void)
{
GetKey(); 

switch(KeyValue)
{
case Key1 : 
if(State[CurrentState].Key1Function != NULL)
   State[CurrentState].Key1Function();
break;
           
case Key2 : 
if(State[CurrentState].Key2Function != NULL)
   State[CurrentState].Key2Function();
break;
           
case Key3 : 
if(State[CurrentState].Key3Function != NULL)
   State[CurrentState].Key3Function();
break;
}
}

使用特权

评论回复
57
qihao|  楼主 | 2007-11-22 23:41 | 只看该作者

哈哈哈哈哈 有高人出手要收官这帖子了

谢谢  thankw

使用特权

评论回复
58
thankw| | 2007-11-23 00:11 | 只看该作者

呵呵

呵呵,这个不是很难的,用过就明白了。

使用特权

评论回复
59
qihao|  楼主 | 2007-11-23 08:35 | 只看该作者

说句实话,现在没看懂,

等俺把把手里的东西忽悠好了再回来学习。  谢

使用特权

评论回复
60
jetbo| | 2007-11-23 10:12 | 只看该作者

.



case Key1 : 
if(State[CurrentState].Key1Function != NULL)
   State[CurrentState].Key1Function();
break;

呵呵,没看明白,每一个功能程序到底是怎样执行的?

使用特权

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

本版积分规则