我通常在嵌入式设备之间使用硬连线串行端口连接来实现自定义命令/响应/状态协议。 在这个应用程序中,我计划使用微芯片TCP / IP堆栈和没有操作系统的Wi-Fi模块来交换短(< = 100字节)命令和响应。 堆栈已在微芯片以太网开发套件上启动并运行,我可以从我的桌面ping它(暂时不使用Wi-Fi模块)。 我想我可以破解ping(微芯片提供堆栈的c源)并添加我需要的消息,但我正在寻找正确/最简单/最好的方法。
答案 0 :(得分:6)
正确/最简单/最好不一定是一回事。但如果我是你,我会考虑使用UDP而不是TCP。
UDP是一种数据报协议; TCP是面向流的,并且具有更多的开销(以及开销带来的好处)。但UDP更接近当前串行端口面向字节(面向分组)的方法。
您可能有一些更高级别的协议接收/缓冲/校验和/分隔/解析您从UART收到的数据流。如果您使用UDP,您可以使用精简,轻量级的UDP实现很好地模仿它。使用UDP,你只需要输出字节(数据包)和交叉你的手指,他们到达另一端(很像连续)。
TCP是基于重量级连接的协议,具有内置重发,确认,按顺序传送,定时器,退避算法等。在大多数嵌入式系统上,我使用过TCP(几种不同的堆栈) ,UDP重量更轻&在代码大小和代码方面优于TCP。吞吐量。
另外不要忘记TCP被用作互联网的骨干;一些数据包通过十几个或更多跳(路由器/网关)到达最终目的地。数据包被丢弃的地方很多,所以TCP透明地处理了很多混乱的细节。我猜你的系统/情况,我们谈的是局域网(每个人在同一条线路上),传输将非常可靠......因此TCP开销并不是必需的。
有时候TCP的好处证明了开销,但是根据你的编写,我认为你应该考虑建立一个基本的UDP数据报。只需谷歌“简单的udp示例”,你就会看到基本的结构。例如,here is a simple UDP client/server example仅使用43行(服务器)和30行(客户端)。
答案 1 :(得分:2)
当你有一个TCP / IP堆栈时,它应该提供send()函数来发送一些数据消息。
一些小型设备只带有简单的UDP / IP实现,因为这样做要简单得多。如果您不需要TCP的顺序控制和可靠性,您可以考虑使用UDP发送短消息。这对于破解ICMP消息要好得多。
但如果您需要TCP流协议的舒适性和可靠性,请不要在IUDP的基础上重新发明这一点。通常你不能做得更好,效率更高,工作量更少。