基于STM32F103C8T6的ATK-ESP8266 WIFI模块使用笔记

// 初始化 WIFI的复位IO
void WiFi_ResetIO_Init(void)
{
     
	GPIO_InitTypeDef GPIO_InitStructure; // 定义一个设置 IO端口参数的结构体                      
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE); // 使能 PA端口的时钟 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 设置PA4
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速率50MHz
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出方式
	GPIO_Init(GPIOA, &GPIO_InitStructure); // 通过设定的 GPIO_InitStruct结构体参数初始化 GPIOA
	RESET_IO(1); // 复位IO拉高电平
}

定义宏函数 RESET_IO(x),x = 1表示set,x = 0表示reset

#define RESET_IO(x)    GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)x)

WIFI 发送设置指令

// cmd: 指令; timeout: 超时时间(100ms的倍数)
char WiFi_SendCmd(char *cmd, int timeout)
{
     
	WiFi_RxCounter=0; // WIFI接收数据量变量清零             
	memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); // 清空 WIFI接收缓冲区
	WiFi_printf("%s\r\n",cmd); // 发送指令
	while(timeout--) // 等待超时时间到 0 
	{
       
		Delay_Ms(100); // 延时 100ms
		if(strstr(WiFi_RX_BUF,"OK")) // 如果接收到 OK表示指令成功 
			break; // 主动跳出 while循环
		u1_printf("%d ",timeout); // 串口输出现在超时时间
	}
	u1_printf("\r\n"); // 串口输出信息   
	if(timeout<=0)return 1; // 如果 timeout <= 0,说明超时时间到,没有收到 OK,返回 1
	else return 0; // 反之,表示正确,说明收到 OK,通过 break主动跳出 while
}

WIFI 复位

// timeout: 超时时间(100ms的倍数) 
char WiFi_Reset(int timeout)
{
     
	RESET_IO(0); // 复位 IO拉低电平
	Delay_Ms(500); // 延时 500ms
	RESET_IO(1); // 复位 IO拉高电平
	while(timeout--) // 等待超时时间到 0
	{
      
		Delay_Ms(100); // 延时 100ms   
		if(strstr(WiFi_RX_BUF,"ready")) // 如果接收到 ready表示复位成功  
			break; // 主动跳出 while循环  
		u1_printf("%d ",timeout); // 串口输出现在的超时时间 
	}
	u1_printf("\r\n"); // 串口输出信息  
	if(timeout<=0) return 1; // 如果 timeout <= 0表示超时时间到,没有收到 ready返回 1
	else return 0; // 反之表示正确,收到 ready返回 0
}

WIFI 加入路由器指令

// timeout: 超时时间(1s的倍数)
char WiFi_JoinAP(int timeout)
{
     		
	WiFi_RxCounter=0; // WIFI接收数据量变量清零              
	memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); // 清空 WIFI接收缓冲区
	WiFi_printf("AT+CWJAP=\"%s\",\"%s\"\r\n",SSID,PASS); // 发送指令
	while(timeout--) // 等待超时时间到 0
	{
      
		Delay_Ms(1000); // 延时 1s
		if(strstr(WiFi_RX_BUF,"WIFI GOT IP\r\n\r\nOK")) // 如果接收到 WIFI GOT IP表示成功
			break; // 主动跳出 while循环 
		u1_printf("%d ",timeout); // 串口输出现在的超时时间 
	}
	u1_printf("\r\n"); // 串口输出信息
	if(timeout<=0)return 1; // 如果 timeout <= 0说明超时时间到也没有收到返回 1
	return 0; // 正确返回 0          
}

连接 TCP 服务器,并进入透传模式

// timeout: 超时时间(100ms的倍数)
char WiFi_Connect_Server(int timeout)
{
     	
	WiFi_RxCounter=0; // WIFI接收数据量变量清零                          
	memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); //清空 WIFI接收缓冲区
	WiFi_printf("AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ServerIP,ServerPort); // 发送连接服务器指令
	while(timeout--) // 等待超时与否
	{
                           
		Delay_Ms(100); // 延时 100ms    
		if(strstr(WiFi_RX_BUF ,"CONNECT")) // 如果接收到 CONNECT表示连接成功
			break; // 跳出 while循环
		if(strstr(WiFi_RX_BUF ,"CLOSED")) // 如果接收到 CLOSED表示服务器未开启
			return 1; // 服务器未开启返回 1
		if(strstr(WiFi_RX_BUF ,"ALREADY CONNECTED")) // 如果接收到 ALREADY CONNECTED已经建立连接
			return 2; // 已经建立连接返回 2  
		u1_printf("%d ",timeout); // 串口输出现在的超时时间  
	}
	u1_printf("\r\n"); // 串口输出信息
	if(timeout<=0)return 3; // 超时错误返回 3
	else
	{
     
		u1_printf("连接服务器成功,准备进入透传\r\n"); // 串口显示信息
		WiFi_RxCounter=0; // WIFI接收数据量变量清零                 
		memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); // 清空 WIFI接收缓冲区
		WiFi_printf("AT+CIPSEND\r\n"); // 发送进入透传指令
		while(timeout--) // 等待超时与否
		{
      
			Delay_Ms(100); // 延时 100ms
			if(strstr(WiFi_RX_BUF,"\r\nOK\r\n\r\n>")) // 如果成立表示进入透传成功
				break; // 跳出 while循环
			u1_printf("%d ",timeout); // 串口输出现在的超时时间
		}
		if(timeout<=0)return 4; // 透传超时错误返回 4
	}
	return 0; // 成功返回 0
}
// timeout: 超时时间(1s的倍数)
char WiFi_Smartconfig(int timeout)
{
     	
	WiFi_RxCounter=0; // WIFI接收数据量变量清零                     
	memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); // 清空 WIFI接收缓冲区 
	while(timeout--) // 等待超时时间到 0 
	{
      
		Delay_Ms(1000); // 延时 1s
		if(strstr(WiFi_RX_BUF,"connected")) // 如果串口接收到 connected表示成功  
			break; // 跳出 while循环
		u1_printf("%d ",timeout); 串口输出现在的超时时间
	}	
	u1_printf("\r\n"); // 串口输出信息
	if(timeout<=0)return 1; // 延时错误返回 1 
	return 0; // 正确返回 0
}

等待加入路由器

char WiFi_WaitAP(int timeout)
{
     		
	while(timeout--) // 等待超时时间到 0
	{
      
		Delay_Ms(1000); // 延时 1s
		if(strstr(WiFi_RX_BUF,"WIFI GOT IP")) // 如果接收到 WIFI GOT IP表示成功
			break; // 主动跳出 while循环 
		u1_printf("%d ",timeout); // 串口输出现在的超时时间
	}
	u1_printf("\r\n"); // 串口输出信息
	if(timeout<=0)return 1; // 如果 timeout <= 0表示超时时间到没有收到返回 1   
	return 0; // 正确返回 0  
}

WIFI 连接服务器

char WiFi_Connect_IoTServer(void)
{
     	
	u1_printf("准备复位模块\r\n"); // 串口提示数据 
	if(WiFi_Reset(50)){
      
		u1_printf("复位失败,准备重启\r\n");
		return 1;      
	}else u1_printf("复位成功\r\n"); 
	
	u1_printf("准备设置STA模式\r\n"); 
	if(WiFi_SendCmd("AT+CWMODE=1",50)){
     
		u1_printf("设置STA模式失败,准备重启\r\n");
		return 2;
	}else u1_printf("设置STA模式成功\r\n");
	
	if(wifi_mode==0){
      
		u1_printf("准备取消自动连接\r\n");
		if(WiFi_SendCmd("AT+CWAUTOCONN=0",50)){
     
			u1_printf("取消自动连接失败,准备重启\r\n"); 
			return 3;   
		}else u1_printf("取消自动连接成功\r\n"); 
				
		u1_printf("准备连接路由器\r\n");  
		if(WiFi_JoinAP(30)){
     
			u1_printf("连接路由器失败,准备重启\r\n"); 
			return 4;
		}else u1_printf("连接路由器成功\r\n");			
	}else{
     
		if(KEY2_IN_STA==0){
        
			u1_printf("准备设置自动连接\r\n"); 
			if(WiFi_SendCmd("AT+CWAUTOCONN=1",50)){
     
				u1_printf("设置自动连接失败,准备重启\r\n");  
				return 3;
			}else u1_printf("设置自动连接成功\r\n"); 
			
			u1_printf("准备开启Smartconfig\r\n"); 
			if(WiFi_SendCmd("AT+CWSTARTSMART",50))
			{
      
				u1_printf("开启Smartconfig失败,准备重启\r\n");
				return 4;                          
			}else u1_printf("开启Smartconfig成功\r\n"); 

			u1_printf("请使用APP软件传输密码\r\n"); 
			if(WiFi_Smartconfig(60))
			{
      
				u1_printf("传输密码失败,准备重启\r\n"); 
				return 5;            
			}else u1_printf("传输密码成功\r\n");   

			u1_printf("准备关闭Smartconfig\r\n"); 
			if(WiFi_SendCmd("AT+CWSTOPSMART",50))
			{
     
				u1_printf("关闭Smartconfig失败,准备重启\r\n");
				return 6;                                      
			}else u1_printf("关闭Smartconfig成功\r\n");    
		}else{
                                                 
			u1_printf("等待连接路由器\r\n");  
			if(WiFi_WaitAP(30)){
      
				u1_printf("连接路由器失败,准备重启\r\n");  
				return 7;                                   
			}else u1_printf("连接路由器成功\r\n");    				
		}
	}
	
	u1_printf("准备设置透传\r\n");  
	if(WiFi_SendCmd("AT+CIPMODE=1",50)){
       
		u1_printf("设置透传失败,准备重启\r\n");   
		return 8;            
	}else u1_printf("设置透传成功\r\n"); 
	
	u1_printf("准备关闭多路连接\r\n");   
	if(WiFi_SendCmd("AT+CIPMUX=0",50)){
        
		u1_printf("关闭多路连接失败,准备重启\r\n");  
		return 9;                             
	}else u1_printf("关闭多路连接成功\r\n"); 
	
	u1_printf("准备连接服务器\r\n");  
	if(WiFi_Connect_Server(100)){
      
		u1_printf("连接服务器失败,准备重启\r\n"); 
		return 10;                      
	}else u1_printf("连接服务器成功\r\n");  
	return 0;                             
}

你可能感兴趣的:(编程,C语言,STM32,路由器,C++编程实例)