Serial port 数据错误检查

Serial port 数据错误检查,serial-port,crc,Serial Port,Crc,我有个奇怪的问题。我和我的一个朋友认为在计算机之间用声音进行串行端口通信会很有趣。基本上,计算机发出一系列的蜂鸣音来发送数据,并通过麦克风收听蜂鸣音来接收数据。简而言之,世界上最烦人的串行端口。我已经把所有的基础都做好了。我可以过滤出只有一个频率的声音,并且我已经将数据从一台计算机发送到另一台计算机。虽然变速箱没有任何错误,仅受非常大的噪音影响,但仍存在一些问题。我的问题是,有哪些好方法可以检查数据中的错误,更重要的是,可以从这些错误中恢复 我的串行通信是非常标准的,一旦你忘记了它使用声波的事实

我有个奇怪的问题。我和我的一个朋友认为在计算机之间用声音进行串行端口通信会很有趣。基本上,计算机发出一系列的蜂鸣音来发送数据,并通过麦克风收听蜂鸣音来接收数据。简而言之,世界上最烦人的串行端口。我已经把所有的基础都做好了。我可以过滤出只有一个频率的声音,并且我已经将数据从一台计算机发送到另一台计算机。虽然变速箱没有任何错误,仅受非常大的噪音影响,但仍存在一些问题。我的问题是,有哪些好方法可以检查数据中的错误,更重要的是,可以从这些错误中恢复

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

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


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

CRC只是解决方案的一部分。你可以检查坏数据,但是你必须做点什么。发射机必须重新发送数据,需要告知它这样做。协议

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

这解决了几个问题:

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

详细描述了这样一个协议。我从来没有听说过有人真正实现它(除了我)。工作得很好。

我最大的问题是仅在需要时插入暂停,尽管我考虑了表示成功或失败的数据包,但我没有想到超时可以解决此问题。我一直认为超时是为了防止程序在行中断或其他情况下无限期地阻塞读/写命令(显然,它也解决了这个问题)。这个协议很有意义。很明显,我还没有完整地阅读您链接的文档,但它似乎正是我想要的。因此,感谢您提供的提示和参考资料:)Hans的解决方案非常适合处理不可靠的基于数据包的通信,但您还有一个问题,即串行端口数据没有被框装到数据包中。如果您丢失了一本书并失去了对齐,您需要能够重新同步到未来的数据包。您可以通过使用特殊的分隔符字节和转义序列将数据封装到帧中来解决这个问题。HDLC通常用于“打包”串行数据以提高可靠性