0

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

4

2 回答 2

4

好的,这是一件事。

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

到目前为止,我强烈推荐给你的是看DCON协议(有PDF,但有点难找,如果你有兴趣,我会帮你搜索),Modbus ASCII协议(这是一个非常好的选择,并且在世界范围内广泛使用)。其次,Siemens SPA (Serial Protocol ASCII) 也很有趣。

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

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

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

更新

如果使用解析器/词法分析器(除了 harald 提到的其他库,因为有额外的库)来实现解析器,您绝对应该阅读 SO 问题“是否有可用于 8 位嵌入式系统的 flex/bison 的替代方案”。

于 2012-06-20T12:46:31.283 回答
4

您似乎想要的是一个解析器生成器。这是一个工具,您可以在其中相当轻松地指定命令语言的语法,它会生成源代码来为您解析该语法。看看YaccBison,只要许可证与您的工作兼容,他们应该能够为您执行此操作。

您还可以将词法分析器(Lexx/Flexx)添加到混合中,这可以简化将字符流转换为词法标记以供解析器使用。

更新:

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

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

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

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

祝你好运!

于 2012-06-20T13:32:27.987 回答