用于嵌入式设备的好的串行通信协议/协议栈是什么?

40

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

  • 支持多个设备。我们希望能够支持RS485总线。
  • 保证传输。某种确认机制和一些简单的错误检测(CRC16可能足够了)。
  • 非主从结构。理想情况下,从属设备能够异步发送数据。这主要只是为了美学原因,轮询每个从属设备的概念对我来说并不合适。
  • 操作系统独立。理想情况下,它不会完全依赖于抢占式多任务环境。如果能获得其他功能,我愿意让步。
  • ANSI C。我们需要能够将其编译为几个不同的体系结构。

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

我即将开始实施带有猪包确认和无选择重复的滑动窗口协议,但认为也许有人可以省去我的麻烦。有人知道我可以利用的现有项目吗?或者有更好的策略吗?

更新
我已经认真考虑了TCP/IP实现,但是真的希望有一些更轻量级的东西。对于我想做的事情来说,TCP/IP的许多功能都过剩了。虽然我不情愿地接受,但我愿意承认也许我想要的功能在更轻量级的协议中并不包括。

更新2
感谢CAN的提示。我过去看过它,将来可能会使用它。不过,我真的希望库能处理确认、缓冲、重试等。我想我更多地是在寻找网络/传输层而不是数据链路/物理层。

更新3
据了解,在这个领域的最新技术是:

  • 精简版的TCP/IP协议栈。可能以lwIPuIP为基础。
  • 基于CAN协议的实现,它可能会严重依赖CAN总线,因此在其他物理层上不会有用。类似CAN Festival可以帮助开发。
  • 一个HDLC或SDLC实现(比如这个)。这可能是我们要采取的方案。

如果您发现更多答案,请随时发布。


是的,我以前看过那个,还有这个:https://dev59.com/dXRA5IYBdhLWcg3wzhbZ 两者都关注于相对简单的协议。我正在寻找更加健壮和功能齐全的东西。 - Gabe
以下是一些类似的问题,可以帮助您入手。您的要求比其他提问者更多。 https://dev59.com/dXRA5IYBdhLWcg3wzhbZ https://dev59.com/jHVC5IYBdhLWcg3wYQEp - dwhall
@ChrisW 强烈考虑过这个,但我真的希望有一个更轻量级的东西。 - Gabe
OSHDLC已经迁移到https://github.com/dipman/OSHDLC。 - Leonardo Santagada
我在嵌入式开发方面还比较新,对于提出的基本特征缺乏良好串行协议感到有些惊讶。基本上我正在寻找一些关于基本串行RS232的东西,它具有某种形式的误差控制和因此保证传输,如回退n或选择性重复,带有字节填充等等。该问题最后是在2012年编辑的,现在在2017年,我想问Gabe故事的结局是什么,即他们最终采用了什么解决方案,如果在此期间有其他开源项目开始解决此问题。 - Federico Strati
6个回答

12

你考虑过使用HDLCSDLC吗?

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

Uyless Black的《数据链路协议》一直在我的书架上 - 你可能会在其中找到一些有用的材料(甚至可以浏览目录并研究不同的协议)。


我非常喜欢HDLC的外观。你以前成功地使用过它吗? - Gabe

5

喜欢它,这正是我正在寻找的东西。 - Gabe
根据页面上的描述,它非常模块化;因此您可以仅使用IP层并摆脱TCP、UDP和其上面的所有内容。 - Javier
通常情况下,您会希望使用PPP在串行连接上传输IP,但这不支持多点。如果要在多点RS-485上放置IP,则应该使用哪种传输层协议? - Craig McQueen
从拓扑上看,RS-485与旧的同轴以太网类似。可以将数据包封装在一些小帧(带有某些类似于MAC的ID),也可以将它们裸露地放在电线上,并让IP层拒绝不属于你的数据包。 - Javier
3
@Javier的链接已失效。 - Overdrivr
显示剩余2条评论

5

CAN 满足您的多项要求:

  • 支持多设备:它可以在一个总线上支持大量设备。但是,它与RS485不兼容。
  • 保证传输:物理层使用比特填充和CRC,这些都在越来越多的现代嵌入式处理器中实现硬件。如果您需要确认,则需要自行添加。
  • 无主从模式:没有主从模式;所有设备都可以随时发送。处理器硬件处理仲裁和争用。
  • 独立于操作系统:不适用;它是一种低级总线。您放置在其上的内容取决于您。
  • ANSI C:同样不适用。
  • 速度:通常为1 Mbps,距离可达40米;您可以根据应用程序选择自己的速度。

正如提到的那样,它的定义相当低级,因此还需要进行工作,将其转化为满足您需求的完整协议。然而,许多工作已经在硬件中完成,使其非常适用于各种应用程序。


谢谢Steve,我以前看过CAN(并且喜欢我所看到的)。但是我真正寻找的是更高级别的逻辑(确认、缓冲等)。CAN非常适合物理/数据链路层。虽然我还没有真正研究过一些解决这些问题的项目,比如CANopen,但我肯定会去了解的。 - Gabe

2
你会考虑使用MODBUS协议吗?它是主/从导向的,因此从设备不能启动传输,但在实现方面轻便、免费,并且有高级工具提供良好支持。你只需要掌握他们的术语,如保持寄存器、输入寄存器、输出线圈等。
物理层可以使用RS232、RS485、以太网等。

2
请查看微控制器互联网网络(MIN): https://github.com/min-protocol/min 受CAN启发,但使用标准的UART硬件,采用Fletcher校验和帧格式检查进行错误检测,并使用字节填充标记帧头。

1

看一下Profibus

如果你不想用主/从模式,我觉得你应该用硬件(CanbusFlexRay)来进行仲裁。


我想避免使用主/从架构,如果可能的话,也不要使用令牌环。我以前从未实现过令牌环网络,但听说过一些坏消息。在数据链路/物理层面上,我可以考虑使用CAN或FlexRay。 - Gabe
1
我不会把Profibus描述为轻量级或快速的。 - Steve Melnikoff
我认为FlexRay不太适合。FlexRay有自己的物理层并且是同步的。它的主要特点是冗余时钟同步,因此有多个主控。 - starblue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接