2014-02-11 66 views
2

我开始为一个设备编写代码,该设备将以全双工模式进行数据输入输出,所以我会在出现问题时使用硬件握手并设置中断条件。但是,当涉及到错误检测时,不太清楚最好的方法是什么。RS232:要校验还是不要校验?

RS232有内置的奇偶校验,我可以使用。据我了解,如果我使用8个数据位,一个奇偶校验位和一个停止位,那么线上的数据包将是10位。这意味着对于每发送1024个字节,我都会发送128字节的验证信息。由于奇偶校验对于每个字节是50/50的事情,因此持续少于一个字节的短暂突发噪声将导致仍然与奇偶校验位一致的损坏不是不太可能的。所以这似乎不是一个可靠的测试。

如果我在每个1024字节的末尾使用校验和,在115200波特仍然只有80ms,我的验证开销从12%下降到小于1%,即使我使用64位校验和。错过腐败很难。

仅仅是一种在sub 100波特连接的时代很有用的技术,它早已过时,我应该使用块校验和,或者我错过了什么?

+0

还有一些值得考虑的事情:可能会出现在使用此环境的环境中的短暂爆发噪声?如果是这样,RS-232肯定是不适合的,它将被视为室内,办公环境总线。更好的选择是RS-485(代码兼容)或更好,CAN(不兼容)。 – Lundin

+0

@Lundin [RS-485](http://en.wikipedia.org/wiki/Rs4850)将不满足OP需要的“全双工模式下的数据输入和输出”,它不是全双工通信协议。 [RS-422](http://en.wikipedia.org/wiki/Rs422)将提供更好的电噪声免疫力,但仍保留全双工能力。 – chux

+1

@Lundin - *“RS-232 ...被认为是......巴士” - 不是“巴士”,而是通信链路。巴士意味着控制,寻址,甚至是电力以及数据。 – sawdust

回答

1
  1. 建议计算并附加CRC而不是校验和。 16位可能会满足您的需求 - 我会使用32位。随机噪声的16位在64k中将失败1。 4G中的32位1。

  2. 校验和虽然容易计算,但会受到噪声突发的影响,被解释为0 - 就串行错误而言并不罕见。

  3. 开销计算有点偏离。 1开始+8数据+1停止位= 10对10 +奇偶校验= 11.

  4. 奇偶不值得它IMO。除了帧错误(错误停止位)提供的内容之外,没有发现太多的东西。不提供消息完整性。

+0

CRC和校验和是两个不同的东西(它们都是不经意地使用的)。 CRC是用于计算_checksum_的_algorithm_(循环冗余校验)。更正式地说,从CRC算法获得并添加到包中的校验和被称为[FCS](http://en.wikipedia.org/wiki/Frame_check_sequence)(帧校验序列)。 – Lundin

+1

@Lundin根据我的经验,校验和(值)是以前数据的总和(算法) - 因此名称为“校验和”。校验码(值)是描述附加到循环冗余校验(CRC)的消息的代码的通用名称,但是是用于计算这些消息的许多算法之一。短语“CRC”当然适用于算法。但它也适用于检查代码本身。许多通信标准将校验码称为“CRC”(例如ISO 15693.),但是可能ISO不是正式的,应该称之为FCS? – chux

4

奇偶校验是一种非常粗糙,老式的错误检测方式。它为您的传输增加了很多开销:实际上它比校验和增加了更多的延迟。对于以115200波特发送的1024字节,奇偶校验会导致8.88ms的额外延迟。所以最好忘记你曾经听说过平价,并认为它是一个过时的功能。对于使用哪种校验和算法,CRC被广泛认为是最好的选择。但是,具有64位多项式的CRC需要相当长的一段时间来计算。

考虑将大块数据分成更小的包,每个包都有较小的校验和,比如CRC-8或CRC-16。

+0

在出现这个时候已经接受了其他答案,两者都很相当,但是非常感谢。 –

+0

@CraigGraham该网站可以让你改变主意:)尽管你可以对所有答案都赞成有帮助。 – Lundin