8

在串行通信链路中,首选的成帧/同步方法是什么?

  • 使用 SOF 和转义序列进行取景,例如在 HDLC 中?
  • 依赖于使用带有长度信息和 CRC 的标头?

它是一个嵌入式系统,使用 DMA 将数据从 UART 传输到内存。我认为 SOF 的取景方法最吸引人,但也许另一种就足够了?

有人对这两种方法有优缺点吗?

4

1 回答 1

6

以下基于UART串行经验,不是研究。

当包含以下内容时,我发现较少的通信问题 - 或者换句话说,同时执行 SOF/EOF 和(长度 - 也许)/校验码。框架:

  1. SOFrame
  2. (长度可能)
  3. 数据(地址、到、从、类型、序列号、操作码、字节等)
  4. 校验码
  5. EO框架

总是,收到的“名声”包括:

  1. 好的 - 没有问题。
  2. 由于发送方未发送完整消息而损坏(它挂起、断电或开机后传输)(接收方应超时陈旧的不完整消息。)
  3. 由于噪声或传输干扰而损坏。(字节帧错误、奇偶校验、错误数据)
  4. 由于接收器在发送消息的中间启动或由于输入缓冲区溢出而丢失几个字节而损坏。
  5. 共享巴士碰撞。
  6. Break - 这在您的系统中是否合法?

无论您使用什么帧,确保它能够可靠地处理这些消息类型,及时验证 #1 并快速识别 2-5 并为下一帧做好准备。

SOF的巨大优势在于它很容易重新开始,如果接收器由于之前的废话帧等而丢失。

长度很好,但恕我直言,最没用。如果长度需要在消息的开头,它可以限制吞吐量。一些低延迟操作在准备开始传输之前只是不知道长度。

CRC推荐大于 2 字节。一个简短的检查代码对我来说并没有足够的改善。我宁愿没有校验码也不愿有一个 1 字节的校验码。如果不时发生错误只能被校验码捕获,我想要比 2 字节的 99.999% 更好的东西,我喜欢 4 字节的 99.99999997%

EOF太有用了!

顺便说一句:如果您的协议是 ASCII(而不是二进制),建议不要使用crlf作为 EOFrame。也许只在它们不是消息的一部分的情况下使用它们。

BTW2:如果您的接收器可以自动检测波特率,它可以节省很多配置问题。

BTW3:发送者可以考虑发送一个“无”字节(在 SOF 之前)以确保正确的 SOF 同步。

于 2013-06-19T04:22:41.837 回答