【问题标题】:Data Error Checking数据错误检查
【发布时间】:2012-02-06 13:43:09
【问题描述】:

我有一个奇怪的问题。我和我的一个朋友认为使用声音在计算机之间进行串行端口的通信会很有趣。基本上,计算机会发出一系列哔声以发送数据,并通过麦克风收听哔声以接收数据。总之,世界上最讨厌的串口。我已经解决了所有基础知识。我可以过滤掉只有一种频率的声音,并且我已经将数据从一台计算机发送到另一台计算机。虽然传输是相当无差错的,仅受非常响亮的噪音影响,但仍然存在一些问题。我的问题是,有什么好方法可以检查数据是否有错误,更重要的是,可以从这些错误中恢复。

一旦您了解了它使用声波的事实,我的串行通信就非常标准了。我在每一帧中使用一个起始位、8 个数据位和一个停止位。我已经考虑过循环冗余检查,并且我计划将其纳入我的错误检查中,但 CRC 并没有解决一些更隐蔽的问题。例如,考虑发送两个字节的数据。您发送第一个,它正确接收,但就在第一个字节的停止位和下一个字节的起始位之后,一本大书掉在地板上,接收器将其解释为起始位,现在真正的起始位作为数据的一部分被读取,并且接收器可能正在读取许多字节的垃圾数据。最终,数据暂停可以让事情重回正轨。

不过,这还不是最糟糕的。位也可以丢弃,我能想到的大多数错误检查方案都依赖于接收一定数量的字节。当接收者一直在等待可能不会到来的字节时会发生什么?

因此,您可以看到这个问题的复杂性。如果您可以指导我获取任何资源,或者只是给我一些提示,我将非常感谢您的帮助。

【问题讨论】:

    标签: serial-port crc


    【解决方案1】:

    CRC 只是解决方案的一部分。您可以检查不良数据,但您必须对此采取措施。发送器必须重新发送数据,需要告知它这样做。一个协议。

    起点是将数据拆分为数据包。一种常见的方法是一个起始字节表示数据包的开始,后跟一个数据包编号,然后是一个表示数据包长度的长度字节。其次是数据字节和CRC。接收方返回一个 ACK​​ 或 NAK 表示成功。

    这解决了几个问题:

    • 您不再关心糟糕的开始位,您需要恢复的暂停始终存在
    • 在收到第一个比特或字节时启动计时器,在收到整个数据包之前计时器到期时声明失败
    • 数据包编号可帮助您从错误的 ACK/NAK 返回中恢复。发送端超时重发包,可以检测到重复

    RFC 916 详细描述了这样一个协议。我从未听说过有人真正实施它(除了我)。效果很好。

    【讨论】:

    • 我最大的问题是仅在需要时插入暂停,虽然我考虑过指示成功或失败的数据包,但我没有想到超时作为解决此问题的方法。我一直认为超时是为了防止您的程序在线路中断或其他情况时无限期地阻塞读/写命令(好吧,它显然也解决了这个问题)。这个协议很有意义。显然我还没有完整阅读您链接的文档,但它似乎正是我正在寻找的。所以,感谢您的提示和资源:)
    • Hans 的解决方案非常适合处理不可靠的基于数据包的通信,但是您还有一个额外的问题,即串行端口数据没有成帧成数据包。如果您丢了一本书并失去了对齐,您需要能够重新同步到未来的数据包。您可以通过将数据封装到具有特殊分隔符字节和转义序列的帧中来解决此问题。 HDLC 通常用于“打包”串行数据以提高可靠性
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多