我正在为分布式系统中的串行通信编写一个简单的多点RS485协议。我使用的是可寻址模型,其中从属设备被给予20ms的响应时间窗口。主uC轮询连接的设备以获取更新,这些设备相应地做出响应。我使用了校验和,并采取了必要的溢出预防措施,以确保连接的设备不会响应格式错误的消息。这种方法在大约99%的情况下被证明是有效的,但如果在通信会话期间引入新设备,我会丢失数据包。插入新设备“热”将对从属设备监控的信号产生负面影响,即使是极短的时间也是如此。我在工程的软件方面,但是我如何在不尝试重新创建TCP的情况下缓解这种情况呢?我们使用轮询模型,因为它速度快,并且在我们的应用程序中做得很好,不需要RTOS功能。从基本的角度来看,我在每个cpu上都有大量的周期。
发布于 2010-08-31 13:51:06
通过RS485发送数据包不是一种可靠的通信。不管怎样,你都得处理丢包的问题。当然,您不必重新发明TCP。但您必须通过超时监视和序列号来检测丢失的数据包。在简单的应用程序中,这可以在应用程序级别完成,这使您远离TCP的复杂性。当您的轮询模型丢弃所有具有无效校验和的数据包时,集成起来的工作量可能会更小。
如果你想检查冲突,这可能是由热插拔或不正常的设备造成的,可能有一些改进。一些硬件允许回读自己的传输。如果您发现发送的数据和接收的数据之间存在差异,则可以假定存在冲突并重复数据包。这也需要一种序列号。
发布于 2010-08-31 14:10:14
也许我在你的问题中遗漏了一些东西,但你不能直接写主程序,这样如果在允许的时间内没有从设备上看到响应,它就会重新轮询该设备吗?
https://stackoverflow.com/questions/3605979
复制相似问题