关于ESP8266UART转WIFI的速度测试

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gaoguanyixh/article/details/51803866

最近做的一个项目涉及到ESP8266WIFI通信,大概就是一个24BIT的AD以500sps速率采集数据然后通过ESP8266发送到服务器,同时还需要保存到内存卡中。

问题现象;先调通AD采集到内存卡保存,一切正常,加入ESP8266发现数据会丢。经过测试发现时ESP8266发送的时间太长了。问题分析;两通道24bit的ADC采样率500sps,每个数据保存成32bits,也就是4字节,每128个数据做一次保存,并且发送,也就是每256ms做一次。一次需要处理的数据量是2*4*128=1024bytes。

测试函数如下:

</pre><pre>

/*************************************************/
//
//numofdata < 2048
//timeout uint ms
/*************************************************/
void esp8266_SendData(u8 *datbuf, u16 numofdata,u32 timeout)
{
	ST_BodyTypeDef* delayTask;
	u8 str[5] = {0};
	static u8 test[64] = {'S','T'};
	if(numofdata > 2048)
	{
		return;
	}
	str[0] = numofdata / 1000 % 10 + 0x30;
	str[1] = numofdata / 100 % 10 + 0x30;
	str[2] = numofdata / 10 % 10 + 0x30;
	str[3] = numofdata % 10 + 0x30;
	str[4] = '\0';
	//send data to WIFI
	//(+CIPMUX=0)
	g_response = ESP8266_WAIT;
	sendATCmd("+CIPSENDBUF=",str,0x01);
	delayTask = ST_InitBody(timeout,0,(void*)0,(void*)0,ST_RUN,ST_SYNC);
	for(;;)
	{
		if(ESP8266_OK == g_response)
		{
			test[2] = 'c';
			test[3] = 'm';
			test[4] = 'd';
			test[5] = ':';
			test[6] = delayTask->theBody.timecnt / 10000 % 10 + 0x30;
			test[7] = delayTask->theBody.timecnt / 1000 % 10 + 0x30;
			test[8] = delayTask->theBody.timecnt / 100 % 10 + 0x30;
			test[9] = delayTask->theBody.timecnt / 10 % 10 + 0x30;
			test[10] = delayTask->theBody.timecnt % 10 + 0x30;
			test[11] = ' ';
			test[12] = ' ';
			test[13] = ' ';
			ST_SetTaskSyncSta(delayTask,ST_DELETE);
			break;
		}
		if(ST_COMPLETED == ST_TaskSync(delayTask))
		{
			ST_SetTaskSyncSta(delayTask,ST_DELETE);
			break;
		}
	}
	g_response = ESP8266_WAIT;
	UARTSendBytes(test,numofdata);
	delayTask = ST_InitBody(timeout,0,(void*)0,(void*)0,ST_RUN,ST_SYNC);
	for(;;)
	{
		if(ESP8266_SEND_OK == g_response)
		{
			test[14] = 'd';
			test[15] = 'a';
			test[16] = 't';
			test[17] = ':';
			test[18] = delayTask->theBody.timecnt / 10000 % 10 + 0x30;
			test[19] = delayTask->theBody.timecnt / 1000 % 10 + 0x30;
			test[20] = delayTask->theBody.timecnt / 100 % 10 + 0x30;
			test[21] = delayTask->theBody.timecnt / 10 % 10 + 0x30;
			test[22] = delayTask->theBody.timecnt % 10 + 0x30;
			test[23] = '\0';
			test[24] = ' ';
			test[25] = ' ';
			ST_SetTaskSyncSta(delayTask,ST_DELETE);
			break;
		}
		if(ST_COMPLETED == ST_TaskSync(delayTask))
		{
			ST_SetTaskSyncSta(delayTask,ST_DELETE);
			break;
		}
	}
}


函数中,参数numofdata = 1024,参数timeout = 5000ms,参数*datbuf没有用到,

sendATCmd是发送AT指令,因为AT+CIPSEND指令发送之后需要等待1s才能继续发送新的AT指令,所以测试使用的AT+CIPSENDBUF指令。


delayTask = ST_InitBody(timeout,0,(void*)0,(void*)0,ST_RUN,ST_SYNC)函数创建一个计时任务,计时单位是1ms,超时时间是timeout,任务是同步任务,通过运行检测任务状态的函数ST_COMPLETED == ST_TaskSync(delayTask)来判断超时时间是不是已经到了。

在for循环中只要接收到AT指令响应或者等待超时就会退出。如果是AT指令有响应正常退出的情况下,把等待的时间(1ms单位)保存到test数组中,在下一次发送数据的时候发送到服务器。

下图是在PC端的模拟TCP服务器上收到的数据:


结论,ESP8266配置串口波特率256000,发送1024字节数据,等待AT指令响应"SEND OK"需要200ms以上的时间。如果不理会SEND OK响应,强行写入新的数据会返回buff full的错误。

后续,发送的数据数量减少到64字节,发送需要等待的时间也是需要200ms+的时间。所以ESP8266的发送等待时间至少要200ms以上。




展开阅读全文

没有更多推荐了,返回首页