我有一个服务器/ AccessPoint ESP8266将实验性14字节数据发送到接收客户端/站点ESP8266。我的编程IDE和串行监视器是Arduino。传输的数据以串行监视器中可见的每秒100个数据生成,并由10ms延迟控制。但是,接收的数据被转换为字符串并且报告频率低于每秒2次。所以我错过了超过98%的传输数据。我该怎么做才能加快数据接收速度?我怀疑缓冲区有限制。在我的研究中,我已经读过,确认响应非常耗时且可以被覆盖。但其中大部分是通过图书馆抽象出来的,我还没有发现它。
最终我想用加速度计输出替换实验数据。将SD卡添加到接收器以捕获/记录数据。加速度计处于高冲击环境中,可能会破坏SD卡;因此需要将接收器与发射器分开。我已经测试了加速度计,并知道它可以提供10个字符串/秒,最多包含9个字符的字节,加上\ n \ r \ n。所以看起来发射器可以处理,但接收器不能。
我的问题是,接收器缓冲区管理的限制是什么,是否有一个确认元素,如果有,我可以打败它吗?我还能做些什么来获得更高的数据接收速度?
以下是发射器/服务器的显着代码:
void loop()
{
WiFiClient client = server.available();
int data_outgoing[5] = {10, 128, 128, 123, 123};
int mapFun[5];
Serial.print("Sent data: ");
Serial.print(millis());
Serial.println();
for(int i = 0; i < 5; i++)
{
mapFun[i] =data_outgoing[i];
client.print(mapFun[i]);
Serial.print(mapFun[i]);
}
client.print('\n');
delay(10);
以下是接收器/客户端的显着代码:
void loop()
{
if(client.connect(host, 80));
{
if(client.available());
{
String c = client.readStringUntil('\n'); //client.read();
Serial.print(c); Serial.print(" "); Serial.println(millis());
}
}
client.stop();
}
这项工作的基础是this blog。对于其他读者来说,讨论中有很多提示/技巧。
答案 0 :(得分:0)
我发现了一些可以帮助他人并节省大量时间的东西。如果以下内容不正确,请介入。以下是我通过阅读多个来源收集的内容,其中一些可能是正确的。不知道其余的事情。
TCP传输涉及一个确认过程,它为每个传输的数据包带来了一些开销负担。为了优化速度和准确性,通常将传输的数据放入适当大小的分组中以获得用于确认返回开销的一定规模经济性。在ESP8266上,每个Client.print传输都会将数据汇总到一个数据包中,无论多小,都可以传输。小包对于发送ESP和接收ESP都是昂贵的。解决了我的问题的原因是将许多数据元素集中到一个Client.print语句中,再加上&#39; \ n \&#39;用于解析接收ESP中的行并分隔接收的簇的字符。然后,可以通过接收的ESP或后处理来管理多个数据元素,我在电子表格中一直在评估性能。
TCP中的数据包大小有1460字节的限制(可能是Arduino / ESP特定的。)我发现通过&#39;聚类&#39; 12个三个字符值,加上12个控制字符(标签和逗号的组合)我最终每次传输48个字节。虽然远远低于1460的限制,但这远远好于我的第一个序列:传输3个字符,等待确认,传输&#39; n&#39;等待确认,重复打开和关闭。即使只是将“&#39; n”组合在一起使用3个字符会有100%的改进,但我做到了这一点乘以12.所有这一切的结果是接收速度大大提高 - 以至于我需要减慢发送器的速度。当我连接加速度计时,我不想比它生成x,y,z坐标的能力更快,我想这个坐标大约是每秒10套。这也导致了更高的传输成功率 - 几乎完美,除了偶尔的差距。
说到这一点,在每几千个数据元素(偶尔多达10K)之后,接收器每次都会停顿7秒钟。我正在研究那个,但我怀疑设备是否达到了温度限制(两个ESP都触摸起来非常温暖)。也许我应该传输更大的数据包,不那么频繁...但每次7秒延迟让我觉得它可能是Arduino IDE隐藏的一些其他抽象细节。
我读过的解决方案的另一个潜在来源是使用client.stream或server.stream。我稍微涉足了一点,但很快就放弃了。我已经读过2.5 Mbps的数据传输是可能的。这个实验对我来说最高可达(48B * 8b / B)/0.015mS或25.6 Kbps,因此可能有更高的速度。以为我分享了。
接收器代码不会从上面改变。发送器(服务器)代码循环是:
void loop() //Works - crl 3/7/18
{
WiFiClient client = server.available();
Serial.print("Sent data: ");
Serial.print(millis());
Serial.println();
client.print(String(data_outgoing)+","
+ String(data_outgoing+1)+","
+ String(data_outgoing+2)+'\t'
+ String(data_outgoing+3)+","
+ String(data_outgoing+4)+","
+ String(data_outgoing+5)+'\t'
+ String(data_outgoing+6)+","
+ String(data_outgoing+7)+","
+ String(data_outgoing+8)+'\t'
+ String(data_outgoing+9)+","
+ String(data_outgoing+10)+","
+ String(data_outgoing+11)
+ '\n');
Serial.print(data_outgoing);
data_outgoing += 1;
delay(340); //
}