2014-02-17 1109 views
1

我正在寻找使用简单的通信实现2设备之间的串行通信。0x7E为什么通常用作通讯协议中的起始分隔符?

看来像HDLC和xBee中使用的协议似乎使用0x7E作为起始分隔符。

有什么特别的原因,或者我可以使用任何字符作为替代。

+0

您是否使用AT模式或API模式? 0x7E只是API模式的起始分隔符,在这种情况下,您必须根据“用户指南”构建数据包。 – LeonardBlunderbuss

+0

嗨,我没有使用xBee。我只是好奇为什么选择0x7E作为起始分隔符。 – sean

+0

好的。那么如果你使用AT模式的默认通信方式,则不需要分隔符。 – LeonardBlunderbuss

回答

5

原因与数据的组帧有关。

  • 他们需要一个标记来标记传输的开始和结束。
  • 如果需要,他们希望能够复制该标志几次 - 例如,如果您发送
    01111110 01111110 01111110 - 与其他集合相比很容易识别该集合,即使某些位尚未达到另一方面,所以它是独一无二的,更不容易出错。
    (0x7E的= 01111110)

扩展示例:

机1发送:01111110 01111110 01111110
一些接收选项中的错误:
机2的recv:011110011111001111110 - 注意到可以识别3帧非常容易。
机器2 recv:11111001111110011111 - 再次您可以识别3个相框非常容易。
机器2 recv:01111110111111001111110 - 再一次3帧可以很容易识别。

现在让我们看看如果我们选择不同的序列作为标志会发生什么。

实施例1:

机1发送:01011010 01011010 01011010(选择这里标记为01011010
一些用于错误接收的选项:
机2的recv:010010100101101001011010 - 你无法确定,如果这些是偶数帧..

例2:

机1发送:00011000 00011000 00011000(这里标志选择是00011000
一些错误在接收选项:
机2的recv:00110000001100000011000 - 这是一个好的......我们可以看到易3帧..但是..
机2的recv:0010000001100000011000 - 这是很难..可能是3帧,但不能肯定..

你可以阅读更多的Wikipedia information about HDLC(检查帧主体)

一件事.. 所以我知道这家伙有火焰潜力:)
P请记住,我没有选择这个仲裁程序。我只是解释了这个特定序列的原因作为选择。

+1

曾经(很久以前)曾经为串行磁带协议工作过,我可以说你说的是真的,但也有一些其他的考虑因素也是类似的。 –

+0

@HotLicks我也知道这些......但如果我将这些包含在我的答案中,“flame-potential”的数量将会高得多:) 而且,如果我们想要给你买啤酒遇到。 –

+1

似乎0x3c会更好,为此目的(或0x3e为此)。而且甚至可以计算出最好的#假设所有位都有相同的丢弃概率(并且可能不是0x7e)。为什么使用0x7e? – thang