解决ESP8226无法连接到路由器的问题

ESP82226 作为客户端

一、入网设置

在调试之前,注意 串口,波特率(9600)以及 AT指令(指令后添加新行)。

1.重启模块

AT+RST        //指令

OK
0$n荡`llM?x蟄鴃???i:?
################################################
arch:ESP8266, 1
compile_time:Ai-Thinker|B&T
wifi_mac:4c75250dF348
sdk_version:v3.4-22-g967752e2
firmware_version:2.2.0
compile_time:Jun 30 2021 11:28:20

ready

################################################

看到ready,证明模块重启成功。

2.设置工作模式

AT+CWMODE=3     //1. 是station(设备)模式 2.是AP(路由)模式 3.是双模

OK

建议设置成 双模 。

3.以设备模式接入家中路由器

AT+CWJAP="TP-LINK_3E30","123456789"         //指令

WIFI CONNECTED 
WIFI GOT IP         //结果

注意:esp8226 的频段是2.4Ghz,若路由器的频段是5Ghz,需要修改路由器频段,否则会报错。

4.查询IP地址

AT+CIFSR         //指令

+CIFSR:APIP,"192.168.4.1"            //网关
+CIFSR:APMAC,"4e:75:25:0d:ae:2f"
+CIFSR:STAIP,"192.168.0.148"        //esp8226作为客户端的ip地址
+CIFSR:STAMAC,"4c:75:25:0d:ae:2f"
OK

二、连接到 TCP server

1. 开关网络助手,设立TCP服务器

2. 连接服务器 

AT+CIPSTART="TCP","192.168.0.113",8888     //指令,注意双引号逗号都要半角(英文)输入

CONNECT 
OK 

3. 发送数据

AT+CIPSEND=4           // 设置即将发送数据的长度 (这里是4个字节)
>CLCA                 // 看到大于号后,输入消息,CLCA,不要带回车
Response :SEND OK     //结果:成功

注意,这种情况下,每次发送前都要先发送AT+CIPSEND=长度 的指令,再发数据!

三、透传

上面每次发送数据都要进行字符长度设定,如果设置成透传,就能发送任意长度的数据。

1.开启透传模式

AT+CIPMODE=1         //开启透传模式
Response :OK

2.开始发送数据

AT+CIPSEND         //带回车
Response: >        //这个时候随意发送接收数据咯

3.退出透传模式

  • 发送 +++ 这三个字符,值得注意的是该命令没有换行符,不然会失败。
  • 接着发送 AT+CIPMODE=0 命令即可退出透传模式,即回到正常的模式。
  • 四、单片机实现

    #include "reg52.h"
    #include "intrins.h"
    #include "string.h"
    #include "stdio.h"
    
    #define SIZE 12
    sfr AUXR = 0x8E;
    sbit D5 = P3^7;
    sbit D6 = P3^6;
    char cmd[SIZE] = {0};
    char buffer[SIZE] = {0};
     
    code char LJWL[] = "AT+CWJAP=\"TP-LINK_D089\",\"123456789\"\r\n";//入网指令
    code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.0.113\",8880\r\n";//连接服务器指令
    char TCMS[] = "AT+CIPMODE=1\r\n"; //透传指令
    char SJCS[] = "AT+CIPSEND\r\n"; //数据传输开始指令
    char RESET[] = "AT+RST\r\n"; //重启模块指令
    
    char AT_OK_Flag = 0; //OK返回值的标志位
    char AT_Connect_Net_Flag = 0; //WIFI GOT IP返回值的标志位
    
    void UartInit(void)		//9600bps@11.0592MHz
    {
    	AUXR = 0x01;//提升单片机的抗干扰能力
    	SCON = 0x50;//配置串口工作方式1,REN接收
    	TMOD &= 0x0F;
    	TMOD |= 0x20;//定时器1工作方式,8位自动重载
    	
    	TH1 = 0xFD;
    	TL1 = 0xFD;//9600波特率的初值                  
    	TR1 = 1;//启动定时器
    	
    	EA = 1;//开启CPU总中断
    	ES = 1;//开启串口中断
    }
    
    void Delay1000ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	i = 8;
    	j = 1;
    	k = 243;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    void sendByte(char data_msg)
    {
    	SBUF = data_msg;	
    	
    	//TI判断是否发送数据:TI=1,发送成功;TI=0,发送失败
    	while(!TI);//字符未发送成功一直循环。
    	TI = 0;//TI重新赋值
    }
    
    void sendString(char* str)
    {
    	while(*str != '\0'){
    		sendByte(*str);
    		str++;
    	}
    }
    
    void main()
    {
    		int mark = 0;
    		D5 = 1;
    	
    		UartInit();//配置C51串口通信方式
    		Delay1000ms();//给esp8226模块上电时间
    		
    		sendString(LJWL);//连接网络
    		while(!AT_Connect_Net_Flag);
    
    		sendString(LJFWQ);//连接服务器
    		while(!AT_OK_Flag);	
    		AT_OK_Flag = 0;
    
    		sendString(TCMS);//透传模式
    		while(!AT_OK_Flag);
    		AT_OK_Flag = 0;
    
    		sendString(SJCS);//数据传输
    		while(!AT_OK_Flag);
    	
    		if(AT_Connect_Net_Flag){
    			D5 = 0;//点亮D5,代表入网成功
    		}
    		
    		if(AT_OK_Flag){
    			D6 = 0;//点亮D6,代表连接服务器并打开透传成功
    		}
    
    		while(1){
    			if(mark == 0) mark = 1;
    			else{
    					sendString("xiaobai handsome\r\n");
    					Delay1000ms();
    			}	
    		}	
    
    }
    
    void Uart_Handler() interrupt 4
    {
    	static int i = 0;//静态变量,被初始化一次
    	char tmp;
    	if(RI)//中断处理函数中,对于接收中断的处理的响应
    	{
    		RI = 0;//清楚接收中断标志位
    		tmp = SBUF;
    		if(tmp == 'W' || tmp == 'O' || tmp == 'L'){
    			i = 0;
    		}
    		
    		buffer[i++] = tmp;
    		
    		if(buffer[0] == 'W' && buffer[5] == 'G'){
    			AT_Connect_Net_Flag = 1;
    			memset(buffer,'\0',SIZE);
    		}
    		
    		if(buffer[0] == 'O' && buffer[1] == 'K'){
    			AT_OK_Flag = 1;
    			memset(buffer,'\0',SIZE);
    		}
    		
    		if(buffer[0] == 'F' && buffer[1] == 'A'){ //连接失败,FALL
    			for(i=0;i<5;i++){
    				D5 = 0;
    				Delay1000ms();
    				D5 = 1;
    				Delay1000ms();
    			}
    			sendString(RESET);// 重启esp8226
    			memset(buffer,'\0',SIZE);
    		}
    		
    		if(buffer[0] == 'L' && buffer[2] == '0'){
    			D5 = 0;//点亮D5
    			memset(buffer,'\0',SIZE);
    		}
    		if(buffer[0] == 'L' && buffer[2] == '1'){
    			D5 = 1;//熄灭D5
    			memset(buffer,'\0',SIZE);
    		}
    		if(i == 12) i = 0;
    		
    	}
    	if(TI);
    }

    ESP82226 作为服务器

    USB转TTL插入电脑,TX–RX,RX-TX,VCC-3.3V,GDN-GND

    一、向串口助手发送AT指令

    1.配置成双模

    AT+CWMODE=2 
    
    Response :OK

    2.使能多链接

    AT+CIPMUX=1 
    
    Response :OK

    3.建立TCPServer

    AT+CIPSERVER=1         // default port = 333 
    
    Response :OK

    4.发送数据

    AT+CIPSEND=0,4         // 发送4个字节在连接0通道上
    
    >abcd                 //输入数据,不带回车 
    Response :SEND OK

    ① 接收数据

    +IPD, 0, n: xxxxxxxxxx     //+IPD是固定字符串 0是通道,n是数据长度,xxx是数据

    ② 断开连接

    AT+CIPCLOSE=0 
    
    Response :0, CLOSED OK

    二、单片机实现

    #include "reg52.h"
    #include "intrins.h"
    #include "string.h"
    #include "stdio.h"
    
    #define SIZE 12
    sfr AUXR = 0x8E;
    sbit D5 = P3^7;
    sbit D6 = P3^6;
    char cmd[SIZE] = {0};
    char buffer[SIZE] = {0};
    
    //1.工作在双模
    char LYMS[] = "AT+CWMODE=3\r\n";
    //2.使能多链接
    char DLJ[] = "AT+CIPMUX=1\r\n";
    //3.建立TCPServer
    char LJFWQ[] = "AT+CIPSERVER=1\r\n"; // default port = 333
    //4.发送数据
    char FSSJ[] = "AT+CIPSEND=0,5\r\n";
    
    char AT_OK_Flag = 0;
    char AT_Connect_Net_Flag =0;
    char Client_Connect_Flag = 0;
    
    void UartInit(void)		//9600bps@11.0592MHz
    {
    	AUXR = 0x01;//提升单片机的抗干扰能力
    	SCON = 0x50;//配置串口工作方式1,REN接收
    	TMOD &= 0x0F;
    	TMOD |= 0x20;//定时器1工作方式,8位自动重载
    	
    	TH1 = 0xFD;
    	TL1 = 0xFD;//9600波特率的初值                  
    	TR1 = 1;//启动定时器
    	
    	EA = 1;//开启CPU总中断
    	ES = 1;//开启串口中断
    }
    
    void Delay1000ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	i = 8;
    	j = 1;
    	k = 243;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    void sendByte(char data_msg)
    {
    	SBUF = data_msg;	
    	
    	//TI判断是否发送数据:TI=1,发送成功;TI=0,发送失败
    	while(!TI);//字符未发送成功一直循环。
    	TI = 0;//TI重新赋值
    }
    
    void sendString(char* str)
    {
    	while(*str != '\0'){
    		sendByte(*str);
    		str++;
    	}
    }
    
    void main()
    {
    	int mark = 0;
    	D5 = 1;
    
    	UartInit();//配置C51串口通信方式
    	Delay1000ms();//给esp8226模块上电时间
    
    	sendString(LYMS);//路由器模式指令
    	while(!AT_OK_Flag);
    	AT_OK_Flag = 0;
    
    	sendString(DLJ);//多连接指令
    	while(!AT_OK_Flag);
    	AT_OK_Flag = 0;
    
    	sendString(LJFWQ);//连接服务器指令
    	while(!Client_Connect_Flag);
    	AT_OK_Flag = 0;
    
    	if(Client_Connect_Flag){
    		D5 = 0;//点亮D5
    		D6 = 0;//点亮D6,有客户连接
    	}
    	
    	while(1){
    		//4 发送数据
    		sendString(FSSJ);//发送数据指令
    		Delay1000ms();
    		Delay1000ms();
    		sendString("Hello");//发送数据"Hello"
    		Delay1000ms();
    		Delay1000ms();	
    	}	
    
    }
    
    void Uart_Handler() interrupt 4
    {
    	static int i = 0;//静态变量,被初始化一次
    	char tmp;
    	if(RI)//中断处理函数中,对于接收中断的处理的响应
    	{
    		RI = 0;//清楚接收中断标志位
    		tmp = SBUF;//SBUF:串口缓存
    		if(tmp == 'O' || tmp == '0' || tmp == ':'){
    			i = 0;
    		}
    		
    		buffer[i++] = tmp;//数组移位
    		//入网成功的判断依据WIFI GOT IP
    		if(buffer[0] == 'O' && buffer[1] == 'K'){//反馈:OK
    			AT_OK_Flag = 1;
    			memset(buffer,'\0',SIZE);
    		}
    		//客户端连接,返回:0,CONNECT
    		if(buffer[0] == '0' && buffer[2] == 'C'){
    			Client_Connect_Flag = 1;
    			memset(buffer,'\0',SIZE);
    		}
    
    		//灯控指令
    		if(buffer[0] == ':' && buffer[1] == 'o' && buffer[2] == 'p'){//客服端发送op,esp返回:+IPD, 0, n: op
    			D5 = 0;//点亮D5
    			memset(buffer,'\0',SIZE);
    		}
    		if(buffer[0] == ':' && buffer[1] == 'c' && buffer[2] == 'l'){//客服端发送cl,esp返回:+IPD, 0, n: cl
    			D5 = 1;//熄灭D5
    			memset(buffer,'\0',SIZE);
    		}
    		if(i == 12) i = 0;
    		
    	}
    }
    物联沃分享整理
    物联沃-IOTWORD物联网 » 解决ESP8226无法连接到路由器的问题

    发表回复