基于STM32智能垃圾桶设计(4)-STM32通过TCP和手机建立通信

本文介绍了如何使用ESP32的AT指令配置Wi-Fi模式、创建SoftAP、重启模块以及设置TCP服务器,包括CWMODE、RST、CWSAP、CIPMUX和CIPSERVER等指令。展示了初始化过程和串口通信的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇中我们成功给ESP32刷入AT固件后,就可以使用AT固件配置成局域网通信模式,完成一个手机APP和STM32通信的功能。下面是几条会用到的AT指令。

AT常见指令

"AT+CWMODE=2" 是 ESP8266 或 ESP32 模块的 AT 指令之一,用于设置模块的 Wi-Fi 模式。

具体而言,Wi-Fi 模式可以设置为以下之一:

  • 模式 1:站点模式(连接到 Wi-Fi 接入点)
  • 模式 2:SoftAP 模式(创建一个 Wi-Fi 接入点)
  • 模式 3:SoftAP + 站点模式(既连接到 Wi-Fi 网络又创建一个接入点)

因此,"AT+CWMODE=2" 将模块设置为 SoftAP 模式,允许它作为 Wi-Fi 接入点运行。

"AT+RST" 是 ESP8266 或 ESP32 模块的另一个 AT 指令,用于重启模块。执行这个指令将导致模块重新启动,重新初始化其设置。

AT+CWSAP="你想创建的WIFI名字","WIFI密码" 这个指令给 ESP8266 或 ESP32 模块时,它会设置一个 SoftAP(接入点),并为该接入点指定了一个SSID(网络名称)为"你想创建的WIFI名字",密码为"WIFI密码"。

"AT+CIPMUX=1" 是 ESP8266 或 ESP32 模块的 AT 指令之一,用于配置模块的连接模式。具体而言,这个指令设置模块为多连接模式。

  • AT: AT 指令的前缀,表示接下来的内容是模块的指令。

  • CIPMUX: 这个指令用于配置模块的连接模式。

  • =1: 这部分指令参数将连接模式设置为多连接模式,允许模块同时处理多个连接。

当连接模式设置为 1 时,模块允许多个客户端同时连接到它,每个连接都有一个唯一的 ID。这在服务器场景中很有用,因为模块可以同时与多个客户端通信。

"AT+CIPSERVER=1,8080" 是 ESP8266 或 ESP32 模块的 AT 指令之一,用于设置模块作为 TCP 服务器,并指定服务器监听的端口号。

  • CIPSERVER: 这个指令用于设置模块作为 TCP 服务器。

  • =1,8080: 这部分指令参数将服务器模式设置为开启(1),并指定服务器监听的端口号为8080。

执行这个指令后,模块将开始在指定的端口(这里是8080)上监听连接请求,允许客户端通过 TCP 连接到模块。这在建立基于 TCP 的通信应用程序时非常有用,例如建立一个简单的网络服务器。

"AT+CIPSEND" 是 ESP8266 或 ESP32 模块的 AT 指令之一,用于启动数据发送模式,使模块能够发送数据到指定的连接。

  • CIPSEND: 这个指令用于启动数据发送模式。

本次主要编写两个函数进行ESP32的初始化,我们发出AT指令后要等待模块的回复OK等字符后才能进行下一条指令配置。

char esp8266_send_cmd(char *cmd,char *ack,u16 waittime)
{
 
u2_printf(cmd);
	
if(ack&&waittime)		
	{
		while(--waittime)	
		{
			HAL_Delay(10);
		if(strstr((const char*)RxBuffer,(const char*)ack)) //on,LED0
		{
			Uart2_Rx_Cnt=0;
			memset(RxBuffer,0x00,sizeof(RxBuffer));
    return 1;
 
    }
		}
 
	}
	return 0;
}

上述代码中,第一个参数传入AT指令的字符串形式,第二个参数传入等待的应答字符串,最后一个参数传入等待的应答时间,直到接受到想要的应答字符才进行下一步。 

void esp8266_start_trans(void)//ESP8266
{
	
	esp8266_send_cmd("AT+CWMODE=2","OK",50);
 
	esp8266_send_cmd("AT+RST","ready",20);
	
	HAL_Delay(1000);       
	esp8266_send_cmd("AT+CWSAP=\"ESP32\",\"123456789\",1,4","OK",200);
	esp8266_send_cmd("AT+CIPMUX=1","OK",20);
	esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);
	esp8266_send_cmd("AT+CIPSEND","OK",50);
}

这个就是一个完成的ESP3201S初始化的程序,对于接线时候我们只要选择一组串口和它接上就行,依次发出AT指令完成TCP服务器搭建。那么通过这个程序ESP01会搭建一个名字叫ESP32,密码是123456789的WIFI,我们使用手机连接WIFI再使用支持TCP调试的助手APP即可进行通信调试了。

接下来一段程序是对串口字符串的简单处理,以完成通信测试。

在主函数程序初始化时候先打开串口接受中断,然后书写回调函数如下。

HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer, 1);

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
	if(huart->Instance==USART3)
	{
		if(Uart2_Rx_Cnt >= 255)  //????
		{
			Uart2_Rx_Cnt = 0;
			memset(RxBuffer,0x00,sizeof(RxBuffer));	        
		}
		else
		{
			static uint8_t Uart2_count=0;
			
			RxBuffer[Uart2_Rx_Cnt] = aRxBuffer; 
			if(receive_flag==0)
			{
			if(RxBuffer[Uart2_Rx_Cnt-Uart2_count]=='<')
			{	
				Uart2_count++;
			if((RxBuffer[Uart2_Rx_Cnt]=='>')||Uart2_count>=14)
			{
				uint8_t My_i=0;
			for(int i=Uart2_Rx_Cnt-Uart2_count+1;i<Uart2_Rx_Cnt+1;i++)
				my_order[My_i++]=RxBuffer[i];
				receive_flag=1;
				Uart2_count=0;
			}
		}
		}
			Uart2_Rx_Cnt++;
		}
	}
    HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer, 1);
}

接受到字符格式<命令字符>,我们就可以对字符串进行解析和处理了。

			if(strstr((const char*)my_order,(const char*)"<r1on>")) 
			{
				uart1txflag=1;
				Uart2_Rx_Cnt=0;
				memset(RxBuffer,0x00,sizeof(RxBuffer)); 
				memset(RxBuffer,0x00,sizeof(my_order));
				s1=1;
			}

例如我这里写的一个如果接收到<r1on>则打开垃圾桶1。

下图我使用的是应用市场下载的网络调试精灵,点击下面的TCP客户端

设置如下 

显示连接上后可以发送<r1on>,观察舵机是否打开。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白研究僧学习嵌入式

谢谢您的鼓励,会持续努力滴!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值