STM32串口发送数据至阿里云(ESP8266连接阿里云)

        当我们使用STM32与ESP8266通信时,通常我们需要等待ESP8266返回'OK'时再进行下一次数据的发送,如果返回'ERROR'则说明配置错误,因此不能一味的发送数据。

        

主要变量和宏

unsigned char  esp8266_buf[1024];
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;

#define REV_OK		0	//接收完成标志
#define REV_WAIT	1	//接收未完成标志

串口收发函数配置

//==========================================================
//	函数名称:	USART2_IRQHandler
//
//	函数功能:	串口2收发中断
//
//	入口参数:	无
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void USART2_IRQHandler(void)
{

	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断
	{
		if(esp8266_cnt >= sizeof(esp8266_buf))	esp8266_cnt = 0; //防止串口被刷爆
		esp8266_buf[esp8266_cnt++] = USART2->DR;
		
		USART_ClearFlag(USART2, USART_FLAG_RXNE);
	}

}

等待接收完成函数

//==========================================================
//	函数名称:	ESP8266_WaitRecive
//
//	函数功能:	等待接收完成
//
//	入口参数:	无
//
//	返回参数:	REV_OK-接收完成		REV_WAIT-接收超时未完成
//
//	说明:		循环调用检测是否接收完成
//==========================================================
_Bool ESP8266_WaitRecive(void)
{

	if(esp8266_cnt == 0) 							//如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
		return REV_WAIT;
		
	if(esp8266_cnt == esp8266_cntPre)				//如果上一次的值和这次相同,则说明接收完毕
	{
		esp8266_cnt = 0;							//清0接收计数
			
		return REV_OK;								//返回接收完成标志
	}
		
	esp8266_cntPre = esp8266_cnt;					//置为相同
	
	return REV_WAIT;								//返回接收未完成标志

}

发送命令函数

//==========================================================
//	函数名称:	ESP8266_SendCmd
//
//	函数功能:	发送命令
//
//	入口参数:	cmd:命令
//				res:需要检查的返回指令
//
//	返回参数:	0-成功	1-失败
//
//	说明:		
//==========================================================
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
	
	unsigned char timeOut = 200;

	Usart_SendString(USART2, (unsigned char *)cmd, strlen((const char *)cmd));
	
	while(timeOut--)
	{
		if(ESP8266_WaitRecive() == REV_OK)							//如果收到数据
		{
			if(strstr((const char *)esp8266_buf, res) != NULL)		//如果检索到关键词
			{
				ESP8266_Clear();									//清空缓存
				
				return 0;
			}
		}
		
		delay_ms(10);
	}
	
	return 1;

}


清空缓存函数

//==========================================================
//	函数名称:	ESP8266_Clear
//
//	函数功能:	清空缓存
//
//	入口参数:	无
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void ESP8266_Clear(void)
{

	memset(esp8266_buf, 0, sizeof(esp8266_buf));
	esp8266_cnt = 0;

}

完成配置后就可以根据阿里云MQTT连接参数进行ESP8266的初始化了(以下参数中涉及私人定义的宏更改参数即可)

//==========================================================
//	函数名称:	ESP8266_Init
//
//	函数功能:	初始化ESP8266
//
//	入口参数:	无
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void ESP8266_Init(void)
{
	
	ESP8266_Clear();
	
	UsartPrintf(USART_DEBUG, "0. RST\r\n");
	while(ESP8266_SendCmd("AT+RST\r\n", "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "1. AT\r\n");
	while(ESP8266_SendCmd("AT\r\n", "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "2. CWMODE\r\n");
	while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "3. CWDHCP\r\n");
	while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "4. CWJAP\r\n");
	while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "5. CONFIG CERT INFO\r\n");
	while(ESP8266_SendCmd(ESP8266_CERT_INFO, "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "6. CONFIG ALIYUN NETWORK\r\n");
	while(ESP8266_SendCmd(ESP8266_ALIYUN_INFO, "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "7. SUBSCRIBE TOPIC\r\n");
	while(ESP8266_SendCmd(ESP8266_SUBTOPIC_INFO, "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "8. ESP8266 Init OK\r\n");

}

根据上述步骤即可完成STM32与阿里云平台的连接。每次发送命令时都需要ESP8266返回'OK'之后再发送命令,同时在调试串口进行打印输出以便及时发现问题。

发送数据函数

//==========================================================
//	函数名称:	ESP8266_SendData
//
//	函数功能:	发送数据
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void ESP8266_SendData()
{

	int cmdBuf[256];
	
	ESP8266_Clear();								//清空接收缓存
	
	sprintf((char *)cmdBuf,"AT+MQTTPUB=0,\""PUB_TOPIC"\",\""JSON_FORMAT"\",0,0\r\n",temp,humi);   //发送命令	
	
	if(ESP8266_SendCmd((char *)cmdBuf, "OK") == 0);
}

通过发送数据函数将STM32采集到的温湿度信息上传至阿里云物联网平台,至此即完成STM32连接阿里云物联网平台,同时上传实时数据。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32ESP8266是两种常见的嵌入式开发模块,可以实现多个数据同时连接阿里云的功能。 首先,STM32是一种基于ARM Cortex-M系列的微控制器,具有丰富的外设和强大的计算能力。它可以通过UART、SPI或I2C等通信接口与ESP8266模块进行交互。 ESP8266是一款低成本且高度集成的Wi-Fi模块,可以实现与互联网的通信。它具有强大的网络协议栈和TCP/IP协议的支持,可以通过Wi-Fi连接阿里云服务器。 要实现多个数据同时连接阿里云的功能,可以使用STM32作为主控制器,通过串行通信协议(例如SPI或UART)与多个ESP8266模块进行通信。 首先,STM32需要配置相应的串行通信接口,与每个ESP8266模块分别建立连接。可以使用UART或SPI来实现数据的传输。设置合适的波特率、数据位、校验位等,保证数据的可靠传输。 然后,通过STM32的程序控制,向每个ESP8266模块发送连接阿里云服务器的指令。ESP8266模块通过Wi-Fi将数据传输给阿里云服务器,实现数据的上传和下载。 为了实现多个数据同时连接,可以采用多任务或多线程的方式来实现。通过合理的任务调度或线程管理,可以使得每个ESP8266模块在不同的时间片内进行数据传输,实现多个数据的同时上传或下载。 最后,需要在阿里云服务器上配置相应的云端服务,以接收和处理来自ESP8266模块的数据。可以使用阿里云提供的SDK和API进行开发和集成。 综上所述,通过STM32ESP8266的组合,配置适当的通信接口、实现多任务或多线程调度,可以实现多个数据同时连接阿里云的功能。 ### 回答2: stm32esp8266连接方式有很多种,其中一种常用的方式是通过串口通信进行数据传输。首先,需要将stm32esp8266连接起来,其中stm32串口发送引脚(TX)连接esp8266串口接收引脚,而stm32串口接收引脚(RX)连接esp8266串口发送引脚。然后,需要进行相应的软件配置。 在stm32中,需要编写相应的代码来实现串口通信功能,并通过串口发送数据esp8266。在通过串口发送数据时,可以使用AT指令来控制esp8266进行连接以及数据上传到阿里云。例如,可以通过发送AT+CWMODE=1指令来设置esp8266为Station模式,并通过发送AT+CWJAP="WiFi名称","WiFi密码"来进行WiFi网络的连接。然后,可以发送AT+TCPSTART="阿里云地址",端口号来建立与阿里云的TCP连接,并通过AT+TCPSEND指令发送数据阿里云。 在esp8266中,需要编写代码来实现串口接收和解析stm32发送过来的数据,并执行相应的操作。例如,当接收到stm32发送的数据时,可以解析出需要上传到阿里云的数据,并通过HTTP或MQTT等协议将数据上传到阿里云。 需要注意的是,为了确保数据的可靠传输,可以在stm32esp8266之间增加一些校验机制,例如使用CRC校验或者添加一些数据包头部信息。 总之,通过串口通信将stm32esp8266连接起来,并在代码层面进行相应的软件配置和开发,就可以实现stm32多个数据通过esp8266连接阿里云的功能。 ### 回答3: STM32ESP8266可以通过串口进行通信,使得STM32可以通过ESP8266连接阿里云。 首先,需要在阿里云创建一个物联网平台设备。在设备的配置中,获取到设备的Product Key、Device Name和Device Secret等信息。 然后,在STM32中配置串口进行通信,并编写相应的代码。首先,需要使用AT指令将ESP8266串口配置为STA模式,并连接到无线网络。随后,可以通过AT指令将ESP8266配置为TCP模式,然后连接阿里云的服务器IP地址和端口号。 当ESP8266成功连接阿里云后,可以通过AT指令发送数据阿里云平台。可以使用MQTT协议来进行数据传输。首先,需要构建一个MQTT报文,并使用AT+CIPSEND指令发送报文。报文中包括了设备的Product Key、Device Name和Device Secret等信息,以及要发送的数据内容。 阿里云平台接收到数据后,可以进行相应的处理,例如存储到数据库或执行云端函数。返回数据时,阿里云会将结果发送给ESP8266ESP8266再将结果通过串口发送给STM32。 在STM32中,可以通过串口接收数据,并进行相应的处理。可以根据需要,提取出关键信息或执行相应的操作。 总结起来,STM32ESP8266可以通过串口进行通信,ESP8266可以连接阿里云平台,并进行数据传输。这样,STM32就可以通过ESP8266阿里云进行数据交互,实现智能物联网应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值