最近在做个产品,打算有线无线都支持,所以板上集成了ESP-12模块,有线用的W5500。
在办公室测试一切OK,上周去现场测试了一把,发现PC这端收到的数据有大量缺失。
回来折腾了一周,最后发现ESP模块丢掉了一些数据。
情况是这样:
有一台PC作为服务器端,我用Java写了个TCP服务器。
有5块板子上面有ESP12模块,STM32主控,连接WIFI路由器后,通过AT命令连接PC上的TCP服务器,然后把要发的数据通过建立好的TCP连接发给PC。
要发的数据一个包大约有53Bytes,最初是一个包一个包的发,后来发现速度跟不上,因为AT命令需要等待ESP模块返回OK之类的信息,STM32里面等的时候比较久,数据多了速度就跟不上了。
后来我改为一次发多个包,因为ESP模块手册说一次最多可以发2048个Bytes,所以我一次发10个包,大约530Bytes。
在办公室测试的时候没发现问题,因为我开发用的电脑速度够快。
到现场后,用的x200笔记本电脑,速度比较慢,然后就发现有些数据没收到。
回来折腾一周,最后发现有些包,ESP给STM32返回信息是发送OK,但是实际上PC这端没有收到。不知道是不是ESP模块内部的程序有bug,总之没收到。之前因为觉得无线的系统部署方便,所以有线部分的通讯程序没写,昨天把有线通讯的程序写了之后,最后换成有线,还是通过TCP连接发数据,一切OK。
顺便说一下,STM32这端使用了队列来缓冲数据,并确认全部数据包都已被ESP发出,ESP返回OK;PC端加了各种else和异常捕捉,确保有出错时被发现。所以,看上去通讯过程完全正确,但就是丢包了。我发的数据包有序列号,统计了一下,大约会有一半的数据包丢了。
因为时间紧,这个版本估计最能用有线了。过段时间折腾下ESP的开发,自己写个固件来配合STM32
提醒一下大家,使用ESP模块做产品时,注意一下丢包的事。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我发的数据包的序列号是1Byte,从0-255。数据包是其他系统生成的,STM32这边收到的时候本来也不一定完整,所以开始的时候PC端收到数据不是连号的,我也没有在意。数据包大饼200ms有一个,正常情况下1s会有5个,但是偶尔少一点也没关系。
开发用的电脑速度很快,丢得不多,我以为是STM32收到就不完整,所以之前一直没有注意。
到现场后,发现缺失太多,系统基本没办法工作。回办公室研究,才发现是esp搞丢的。
为了测试,还写了一个TCP客户端在电脑上,模拟STM32发tcp数据给服务器。测试时服务器我用vmware跑win7执行java写的tcp服务器。用模拟的客户端发数据时一切正常,因为是本机的pc与vmware通讯,这就排除了tcp服务器速度慢而导致的可能。
换成板子通过esp发数据给vmware上的服务器时,就丢包了。
这种不如用数传
一周热门 更多>