数据错误检查

时间:2012-01-10 03:47:22

标签: serial-port crc

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

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

尽管如此,这并不是最糟糕的。比特也可以丢弃,我能想到的大多数错误检查方案都依赖于接收一定数量的字节。当接收器一直等待可能不会出现的字节时会发生什么?

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

1 个答案:

答案 0 :(得分:2)

CRC只是解决方案的一部分。您可以检查不良数据,但之后您必须对此进行一些操作。发射器必须重新发送数据,需要告知它这样做。协议。

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

这解决了几个问题:

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

RFC 916详细描述了这样的协议。我从来没有听说过任何人实际实现它(除了我)。效果很好。