我正在做一个嵌入式系统项目。它在 ARM M3-Cortex 平台上。我正在使用的设备是一个测量控制器。它可以连接到 PC 并接受一些命令。我尝试设计命令解析器,但在互联网上看到了完全不同的方法。有 30 多个命令。每个命令可以有不同的参数:例如命令日期:?将询问日期,因此设备 LCD 应显示日期,但命令 Date:2012,05,30 应设置日期。有些命令甚至更复杂,具有不同类型的参数,即算法和数据结构应该智能设计。你有什么线索或建议。谢谢朋友:)
2 回答
好的,这是一件事。
你需要实现一个协议。而且我认为是文本协议(因为您的命令要求:)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 的替代方案”。
您似乎想要的是一个解析器生成器。这是一个工具,您可以在其中相当轻松地指定命令语言的语法,它会生成源代码来为您解析该语法。看看Yacc或Bison,只要许可证与您的工作兼容,他们应该能够为您执行此操作。
您还可以将词法分析器(Lexx/Flexx)添加到混合中,这可以简化将字符流转换为词法标记以供解析器使用。
更新:
除了最基本的解析器之外,生成器可能会让你的生活更轻松。当然,前提是资源限制或许可问题不会妨碍您。无论如何,一个好的解析器生成器不应该比手工操作需要更多的资源。正如@gahcep在他的回答中指出的那样,Yacc 和 Bison 还有其他替代品,包括商业替代品。也许其中一些更适合你。
使用解析器生成器的一些优点是:
- 您可以专注于语法而不是如何解析它
- 生成的代码通常会以比直接一次性解析器更优化的方式解决问题。
- 生成的代码应该几乎没有错误。
缺点是生成的代码可能难以调试,并且可能会引入您自己手工编写代码可能没有的依赖关系。检查并找到最适合您和项目的那个。
祝你好运!