C中的命令解析器

时间:2012-06-20 12:26:35

标签: c parsing data-structures embedded interpreter

我正在开发一个嵌入式系统项目。它位于ARM M3-Cortex平台上。我正在使用的设备是一个测量控制器。它可以连接到PC并执行一些命令。我尝试设计命令解析器,但在互联网上看到了完全不同的方法。有超过30个命令。每个命令可以有不同的参数:例如命令日期:?将询问日期,因此设备LCD应显示日期,但命令日期:2012,05,30应设置日期。一些命令甚至更复杂并且具有不同类型的参数,即,应该智能地设计算法和数据结构。 你有任何线索或建议吗?谢谢伙伴:))

2 个答案:

答案 0 :(得分:4)

好的,这是一件事。

您需要实施协议。我认为文本协议(因为您的命令要求:Date:?)。如果你不想使用现有的(这真的令人困惑),你应该至少看看它们的实现和设计。

到目前为止,我高度推荐给我的是 DCON protocol (有一个PDF,但有点难以找到它,如果你有兴趣,我会为你搜索), Modbus ASCII 协议(这是一个非常好的选择和全世界使用)。接下来, Siemens SPA (串行协议ASCII)也是一个非常有用的。

如果您想实施自己的协议(假设您想要实现二进制协议),以下是设计时应考虑的要点:

  • 字节和/或字endianess
  • 浮动表示(IEEE754或固定点))
  • 开始/结束消息标记和ByteStuffing或BitStuffing(注意,它仅存在于Beg / End Markers中)
  • 命令的字节/字节(例如,0x01用于读取线圈,0x02用于写入线圈等。)
  • ACK / NASK字节/确认消息
  • 用于检查邮件有效性的
  • CRC代码

当然,有huge bunch个这样的协议,你熟悉它们中的一些肯定会帮助你更好地设计(或使用现有的协议)。

<强>更新

如果使用解析器/词法分析器(其他harald提到,因为有额外的库)来实现解析器,你一定要阅读SO问题“Is there an alternative for flex/bison that is usable on 8-bit embedded systems”。

答案 1 :(得分:4)

您似乎想要的是解析器生成器。这是一个可以非常轻松地指定命令语言语法的工具,它将生成surce代码以便为您解析此语法。如果许可证与您的工作兼容,请查看YaccBison,他们应该可以为您执行此操作。

您还可以在混音中添加词法分析器(Lexx / Flexx),这样可以简化将字符流转换为词法标记,以便解析器进行咀嚼。

<强>更新

除了绝对最基本的解析器之外,生成器可能会让您的生活更轻松。当然,资源限制或许可问题不会受到影响。一个好的解析器生成器不应该需要比手动操作更多的资源。正如 @gahcep 在他的回答中指出的那样,Yacc和Bison还有其他替代品,包括商业替代品。也许其中一些会更适合你。

使用解析器生成器的一些优点是:

  • 你可以专注于语法,而不是如何解析它
  • 生成的代码通常会以比直接的一次性解析器更优化的方式解决问题。
  • 生成的代码应该几乎没有错误。

缺点是生成的代码可能难以调试,并且可能会在没有手工编写代码的情况下引入依赖关系。检查并找到最适合您和项目的那个。

祝你好运!