嵌入式设备的良好串行通信协议/堆栈?

时间:2009-07-21 13:59:48

标签: c embedded serial-port protocols firmware

在为各种项目编写了几种不同的自定义串行协议之后,我开始对每次重新发明轮子感到沮丧。我不断继续为每个项目开发定制解决方案,而是一直在寻找更通用的解决方案。我想知道是否有人知道符合以下要求的串行协议(或更好的实现):

  • 支持多种设备。我们希望能够支持RS485总线。
  • 保证交货。某种确认机制,以及一些简单的错误检测(CRC16可能很好)。
  • 不是主/从。理想情况下,从设备可以异步发送数据。这主要是出于审美原因,轮询每个奴隶的概念对我来说感觉不对。
  • 操作系统独立性。理想情况下,它根本不依赖于抢占式多任务环境。如果我能得到其他东西,我愿意承认这一点。
  • ANSI C.我们需要能够为几种不同的架构编译它。

速度不是太大的问题,我们愿意放弃一些速度,以满足其他一些需求。但是,我们希望尽量减少所需资源的数量。

我即将开始实施一个带有搭载ACK的滑动窗口协议,而且没有选择性重复,但是想到也许有人可以省去我的麻烦。有谁知道我可以利用的现有项目?或者也许是一个更好的策略?

更新
我认真考虑过TCP / IP实现,但我真的希望能有更轻量级的东西。 TCP / IP的许多功能对于我正在尝试做的事情来说都是过度的。我愿意(不情愿地)接受我想要的功能可能不包含在较轻的协议中。

更新2
感谢关于CAN的提示。我过去看过它,将来可能会用它。我真的很喜欢这个库来处理确认,缓冲,重试等。我想我更需要网络/传输层而不是数据链路/物理层。

更新3
所以听起来这个领域的最新技术是:

  • 精简的TCP / IP堆栈。可能从lwIPuIP开始。
  • 基于CAN的实现,它可能很大程度上依赖于CAN总线,因此在其他物理层上没有用处。像CAN Festival这样的东西可以帮助你。
  • HDLC或SDLC实施(如this one)。这可能是我们要采取的路线。

如果您遇到这个问题,请随时发布更多答案。

6 个答案:

答案 0 :(得分:12)

您是否考虑过HDLCSDLC

还有LAP/D(链接访问协议,D-Channel)。

Uyless Black的“Data Link Protocols”总是在我的书架附近 - 你可能会在那里找到一些有用的材料(甚至仔细阅读TOC和研究不同的协议)

答案 1 :(得分:5)

我猜一个合理的起点可能是uIP

(由于原始链接已死,因此添加Wikipedia article on µIP。)

答案 2 :(得分:5)

CAN符合您的一些标准:

  • 支持多种设备:它支持一条总线上的大量设备。但是,它与RS485不兼容。
  • 保证交付:物理层使用位填充和CRC,所有这些都是在越来越多的现代嵌入式处理器上以硬件实现的。如果你需要acknlowedgement,你需要自己添加它。
  • 不是主/从:没有主人或奴隶;所有设备都可以随时传输。处理器硬件处理仲裁和争用。
  • 操作系统独立性:不适用;这是一辆低级巴士。你最重要的是取决于你。
  • ANSI C:同样,不适用。
  • 速度:通常情况下,最高可达1 Mbps,最长可达40 m;您可以根据自己的应用选择自己的速度。

如前所述,它的定义相当低级,因此仍需要完成将其转换为满足您需求的完整协议的工作。但是,很多工作都是在硬件上完成的,这对各种应用程序非常有用。

答案 3 :(得分:1)

看看Profibus

如果你不想要主/从,我认为你应该用硬件进行仲裁(CanbusFlexRay)。

答案 4 :(得分:1)

你会考虑MODBUS协议吗?它是面向主/从的,因此从属设备无法启动传输,但是实现轻量级,免费且高级工具支持良好。你应该掌握他们的术语/如保持寄存器,输入寄存器,输出线圈等。

Phy级别可以是RS232,RS485,以太网......

答案 5 :(得分:1)

看看微控制器互联网(MIN):

https://github.com/min-protocol/min

受CAN的启发,但使用标准UART硬件,使用Fletcher的校验和和帧格式检查错误检测和字节填充以标记帧头。