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;
}
}