【发布时间】:2015-06-05 18:40:52
【问题描述】:
我做过很多项目,包括 PC 和 arduino / PLC / 某种其他微控制器 / 处理器,在每个项目中,我们都有不同的协议用于 PC 应用程序和嵌入式应用程序之间的通信。通常,硬件/控制器开发人员会发明一个简单的协议,该协议在整个项目中总是会发生变化,并以
的形式出现Barker | Size | Data | Checksum
这一次我正在实施双方,所以我想 - 这已经完成了一百万次。这些东西必须有一个基本协议,并在 C、C#、Java 等中实现。 我正在寻找的是一个轻量级层,它将基于流的串行通信转换为基于消息的通信。
我已经四处寻找了一段时间,但我自己找不到任何东西。 你碰巧认识一个吗?
【问题讨论】:
-
串口协议被反复发明,没有标准。有一个尝试,RFC 916,但它被广泛忽略。它运行良好,但在连接尝试失败时并不完全可靠,因为对方尚未运行,它不能很好地处理缓冲字节。这是根本问题,协议永远不会 100% 故障安全。挑选任何东西或去购物。
-
很大程度上取决于您需要的功能:可以将数据分解为逻辑数据包(例如命令/读数)吗?你想如何处理错误?位错误的可能性有多大?两个节点是否具有良好的时钟同步?什么是帧同步机制?可以热插拔吗?每个节点的缓冲能力是多少?虽然我同意大多数人似乎重新发明了相同的协议,但人们可能有充分的理由为每种情况选择特定功能。
-
虽然我非常同意你的观点,但似乎所有这些要求都可以放在一个库中。我想到的是一个简单的库,它支持你在#ifdef 中提到的所有功能,但仍然是轻量级的。我得说我还没有找到我要找的东西,但是解决方案中提到的一种方法现在可能就足够了。再次编写相同的状态机但使用不同的字节似乎是一种浪费。