用于embedded式设备的良好串行通信协议/堆栈?

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

  • 支持多种设备。 我们希望能够支持一个RS485总线。
  • 保证交付。 某种确认机制,以及一些简单的错误检测(CRC16可能是好的)。
  • 不是主/从。 理想情况下,从机可以asynchronous发送数据。 这主要是出于美学的原因,投票每个奴隶的概念不适合我。
  • OS独立性。 理想情况下,它不会依赖于抢先式的多任务处理环境。 我愿意承认这一点,如果我能得到其他的东西。
  • ANSI C我们需要能够编译几个不同的体系结构。

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

我即将开始实施滑动窗口协议与piggybacked ACK并没有select性的重复,但认为也许有人可以救我这个麻烦。 有谁知道现有的项目,我可以利用? 或者更好的策略?

UPDATE
我认真考虑过一个TCP / IP的实现,但真的希望有更轻量级的东西。 TCP / IP的许多function对于我正在尝试做的事情来说都是过度的。 我愿意接受(勉强),也许我想要的function不包括在较轻的协议中。

更新2
感谢CAN上的提示。 我曾经看过,未来可能会用到它。 我真的很喜欢图书馆处理确认,缓冲,重试等。 我想我更多的是寻找一个networking/传输层,而不是数据链/物理层。

更新3
所以这听起来像这个领域的艺术状态是:

  • 裁减的TCP / IP堆栈。 可能从诸如lwIP或uIP之类的东西开始。
  • 一个基于CAN的实现,它可能很大程度上依赖于CAN总线,所以它在其他物理层上将不会有用。 CAN节日可以帮助你。
  • 一个HDLC或SDLC实现(就像这个一样)。 这可能是我们要采取的路线。

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

你考虑过HDLC还是SDLC ?

还有LAP / D (链路访问协议,D通道)。

Uyless Black的“ 数据链路协议 ”总是在我的书架上 – 你可能会发现一些有用的材料(甚至仔细阅读TOC和研究不同的协议)

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

CAN符合您的一些标准:

  • 支持多种设备:支持一条总线上的大量设备。 但是,它不兼容RS485。
  • 保证交付:物理层使用位填充和CRC,所有这些都是在越来越多的现代embedded式处理器的硬件上实现的。 如果你需要的是低速度,你需要自己添加。
  • 不是主人/奴隶:没有主人或奴隶; 所有设备都可以随时发送。 处理器硬件处理仲裁和争用。
  • 操作系统独立性:不适用; 这是一个低级别的巴士。 最重要的是你自己。
  • ANSI C:同样,不适用。
  • 速度:通常情况下,高达1 Mbps到40米; 你可以select你自己的速度为你的应用程序。

如前所述,它的定义是相当低级的,所以还有工作要做成一个完整的协议来满足你的需求。 但是,很多工作都是在硬件上完成的,这对于各种应用程序非常有用。

看看Profibus 。

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

你会考虑MODBUS协议吗? 它是以主机/从机为导向的,所以从机不能启动传输,但是实现起来是轻量级的,免费的,并且使用高级工具很好的支持。 你只需要掌握他们的术语/像保持寄存器,input寄存器,输出线圈等)。

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

看看微控制器Internetnetworking(MIN):

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

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