ESP8266芯片TCP/UDP高速率实时传输中的数据丢失问题日志

因项目需要,用ESP8266芯片传输振动传感器信号,由于其采样频率很高,所以需要很快的传输速度,随后发现了数据丢失的问题,现已部分解决,解决过程记录如下:

系统组成为MEMS传感器模块---STM32F4---ESP8266模块,其中传感器采样频率根据手册参数设置为4kHz,单片机波特率设置为921600,esp8266波特率同样为921600。

在标准振动台上进行测试时,发现数据丢失的问题,如下图:

这是正常时收到的数据,数据是连续的


丢失数据时收到的数据,可看到第三行与第四行之间有数据的明显丢失

画成图更明显


电脑端接收数据用的是网络串口助手。

原因猜想:

1、发送数据速度大于接收数据速度,在电脑接收端缓冲区满了之后数据丢失

2、流控

3、TCP协议粘包拆包现象

4、波特率过高易出错

对于1,有两个缓冲区,一个是wifi模块的接受缓冲区,一个是pc端的接受缓冲区,计算了每秒钟发送字节数,921600的波特率足够用,pc端我另写了个tcp接收程序,缓冲区设置足够大,仍然不行。

对于2,由于配置F4MCU的程序为网上的代码,网上代码中很少有用到流控的,所以重新初始化了流控引脚,开启流控功能,发现数据时丢失不丢

对于3,尝试了UDP协议传输,发现还是丢数据

对于4,把波特率降为460800,数据丢失的现象大大减少,但还是有,发生率大概为十分之三左右

上面的测试实验可能会有一些不严谨,希望同行们多给指导一下。

后来打电话给了wifi芯片的售后询问,偶然知道了WiFi芯片的传输性能跟距离有很大的关系,之前偷懒一直用手机热点开wifi,并且模块是station模式,手机热点的信号可能偏弱。重新做了实验把手机放在距离芯片大概只有10cm的距离,用460800波特率进行测试,再也不会出现丢失数据的问题了。然而,将波特率设置为921600仍会出现不时的数据丢失现象。

所以,本次试验总结如下,三个因素影响了数据传输

1、流控未配置好

2、wifi信号弱

3、波特率设置过高会出错

另外一个疑问一直存在,关于波特率的功能问题:

传感器芯片的采样速度明明设置为4000HZ,波特率460800时接收到的频率为1000hz左右,921600时接收到的采样频率为1666hz左右,然而频率对不上并没有丢失数据。猜测数据存在了单片机的缓冲区里,iic存入,串口取出?但是长时间工作后应该会溢出?可是用有线串口进行测试并没有出现数据丢失的现象。

猜你喜欢

转载自blog.csdn.net/sinat_37678402/article/details/80005058