C 自定义RS485协议

C 自定义RS485协议,c,embedded,irq,rs485,C,Embedded,Irq,Rs485,我正在为分布式系统中的串行通信编写一个简单的多点RS485协议。我使用的是一个可寻址模型,其中从设备有20毫秒的响应时间。主uC轮询连接的设备进行更新,并相应地做出响应。我使用了校验和并采取了必要的溢出预防措施,以确保连接的设备不会响应格式错误的消息。事实证明,这种方法在大约99%的情况下都是有效的,但是如果在通信会话期间引入了新设备,我会丢失数据包。插入新设备“热”将对从设备监控的信号产生负面影响,即使时间非常短。我是工程软件方面的,但是我如何在不尝试重新创建TCP的情况下缓解这种情况呢?我们

我正在为分布式系统中的串行通信编写一个简单的多点RS485协议。我使用的是一个可寻址模型,其中从设备有20毫秒的响应时间。主uC轮询连接的设备进行更新,并相应地做出响应。我使用了校验和并采取了必要的溢出预防措施,以确保连接的设备不会响应格式错误的消息。事实证明,这种方法在大约99%的情况下都是有效的,但是如果在通信会话期间引入了新设备,我会丢失数据包。插入新设备“热”将对从设备监控的信号产生负面影响,即使时间非常短。我是工程软件方面的,但是我如何在不尝试重新创建TCP的情况下缓解这种情况呢?我们之所以使用轮询模型,是因为它速度快,并且对我们的应用程序很好,不需要RTOS功能。我在每个cpu上都有大量的周期,从基本的角度考虑。

通过RS485发送数据包不是一种可靠的通信。无论如何,您都必须处理丢失的数据包。当然,您不必重新发明TCP。但是,您必须通过超时监视和序列号来检测丢失的数据包。在简单的应用程序中,这可以在应用程序级别完成,这使您远离TCP的复杂性。当您的轮询模型丢弃所有校验和无效的数据包时,这可能会以较少的工作量进行集成


如果你想检查碰撞,那可能是由热插拔或不正常的设备引起的,可能有一些改进。一些硬件允许读回自己的传输。如果您发现发送数据和接收数据之间存在差异,则可以假设发生冲突并重复数据包。这也需要一种序列号。

也许我在你的问题中遗漏了什么,但是你不能只写一个主文件,这样如果在允许的时间内没有从设备上看到响应,它就会重新轮询该设备吗?

很好的建议,每个设备都能够监听自己的传输。热插头确实让我有点伤心。解决方法很简单,我觉得自己没有想到这一点有点傻。谢谢