我有一些用C语言写的旧软件,它用于通过串行电缆(RS232)进行通信的两个设备 - 发送和接收消息。
现在,旧的设备将由没有串行端口但只有以太网的新的现代设备取代
因此,现在的请求是将旧的串行通信转换为UDP通信(C ++是目前的选择)
所以,我对这个“转换”有一些疑问:
1)假设有两个对等体A和B.我应该为每个对等体实现服务器和客户端,即:serverA + clientA(对于设备A)和serverB + clientB(对于设备B)?还是有其他/不同的方法?...
2)旧的串行通信有一些CRC,可能是为了确保一些可靠性。是否必须在UDP通信中实现CRC(在我的自定义消息中)?
提前感谢您的时间和耐心。
答案 0 :(得分:1)
1) UDP是一种无连接协议,因此这里没有严格的客户端和服务器角色。您只需要一些处理接收的代码和一些便于发送的代码。
2)您不需要UDP的CRC。首先,每个以太网帧中都有一个FCS(CRC32)。然后,IP数据包中有一个标头校验和。毕竟,校验和已经包含在UPD数据报中了!
还请考虑以下事项:
在日常生活中,COM端口已经远离物理世界,但它们仍然以虚拟形式存在于我们身边(即使Android手机也有COM端口)。有很多解决方案可以通过USB / TCP /其他方式进行COM。其中一些是PC应用程序,其中一些是用硬件实现的(参见Arduino的COM over USB),
当UDP数据报未通过校验和测试时,它会(通常)以静默方式丢弃。所以在UDP中你没有内置的功能来区分“没有收到任何东西”和“我们收到的东西,但这不是有效的东西”。检查UDP-Lite是否要在应用程序级别处理这些情况(它应该简化我认为的移植过程)。
传输数据的默认选择是TCP,因为它提供可靠的传输。对于那些关心实时的用户以及能够容忍一些数据丢失的用户,建议使用UDP。或者那些关心资源的人。
如果要发送大量数据或准备好处理端口上的数据包拥塞,请选择TCP。如果您打算将来使用无线网络,或者准备好处理周期性的重大数据包丢失,请选择TCP。
如果您的设备很小或充满其他东西,可以直接在2级(以太网)上运行。