2010-08-31 250 views
4

我正在为分布式系统中的串行通信编写一个简单的多点RS485协议。我正在使用一个可寻址的模型,从属设备被给予20ms的窗口来响应。主uC轮询连接的设备进行更新,并相应地作出响应。我采用了校验和并采取必要的超限预防措施,以确保连接的设备不会响应格式错误的消息。这种方法在大约99%的情况下证明是有效的,但是如果在通信会话期间引入新设备,我将丢失数据包。只要在极短的时间内插入新的“热”设备,就会对从设备监控的信号产生负面影响。我在工程的软件方面,但我怎么可以缓解这种情况,而不尝试重新创建TCP?我们使用轮询模式,因为它速度很快,能够很好地完成我们的应用程序,不需要RTOS功能。我在每个cpu上都有丰富的周期,用基本的术语来思考。自定义RS485协议

回答

8

通过RS485发送数据包不是可靠的通信。无论如何,你将不得不处理丢失的数据包。当然,你不必重新创建TCP。但是您将不得不通过超时监控和序列号来检测丢失的数据包。在简单的应用程序中,这可以在应用程序级完成,这使您远离TCP的复杂性。当您的轮询模型丢弃所有具有无效校验和的数据包时,可能会以较少的努力进行整合。

如果你想检查碰撞,可能是由热插拔或行为不当造成的,可能会有一些改进。有些硬件允许读回自己的传输。如果发现已发送数据和接收数据之间存在差异,则可以假定发生冲突并重复数据包。这也将需要一种序列编号。

+0

优秀的建议,每个设备都能够听取它自己的传输。热插头肯定给我一点悲伤。这个解决方案非常简单,我自己没有想到它,我感到有点无聊。谢谢! – Nate 2010-08-31 14:30:43

1

也许我在你的问题中遗漏了一些东西,但是你能不能写出主控,这样如果在允许的时间内没有从设备看到响应,它会重新轮询该设备?