前言
材料
ESP-01S连接网页流程
一、ESP-01S初始化
一、设定一些重要的变量
二、初始化串口
三、整理上面代码,整合成函数(ESP-01S模块初始化)
二、相关函数准备
一、关于串口函数
二、关于数据校验
三、延时函数
三、连接上WIFI(热点)
四、连接上网址
五、运行测试
六、运行结果
总结
主要记录下我学习ESP-01S的时候遇到的困难,和一些细节错误。供大家参考和借鉴。当时我在学时,我就一直在搜索百度,ESP-01S,是否能连接网页,因为我此前已经能用它连接WIFI和局域网信息交流。经过多次尝试,ESP-01S确实能连上WIFI后,从而访问网页。下面,就是演示过程。
STC8A8K64S4A12核心板,ESP-01S,手机热点名称"K30",密码:"88888888"(假装有WIFI),测试网址:苏宁的一个时间网站(http://quan.suning.com/getSysTime.do),
此外,代码部分还会用到AT指令,这里不做过多描述。重在描述思路。
STC8A8K64S4A12核心板(只展示出ESP-01S所接引脚)
ESP-01S(正反照)
手机热点的设置
苏宁时间网址
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define S2RI 0x01 //S2CON.0
#define S2TI 0x02 //S2CON.1
#define tbuf 100 //数据数组长度
extern u8 xdata RX_buffer[tbuf]; //接收数据
extern u8 RX_num; //接收计数变量
这里初始化串口了两个串口,一个用于单片机与ESP-01S的通信,一个用于返回数据到电脑串口上,方便调试。
//初始化串口
void ESP8266_UartInit()
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟1为FOSC,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1工作模式0 为16位自动重装方式
TL1=(65536-(11059200/4/9600)); //设置定时初值
TH1=(65536-(11059200/4/9600))>>8; //设置定时初值
TR1 = 1; //启动定时器1
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟1为FOSC,即1T
T2L=(65536-(11059200/4/115200)); //设置定时初值
T2H=(65536-(11059200/4/115200))>>8; //设置定时初值
AUXR |= 0x10; //启动定时器2
ES = 1; // 串口1中断打开
IE2 = 0x01; // 串口2中断打开
EA = 1; // 总中断打开
}
//ESP8266模块初始化
void ESP8266_Init()
{
ESP8266_UartInit();
ESP8266_Delayms(2000); //等待ESP8266启动
memset(RX_buffer, 0, tbuf);//清缓存数据
RX_num=0; //接收计数变量清0
}
关于字节发送和接收,还有中断事件的。
//串口1发送串口数据(字节)
void ESP8266_U1_byte(u8 Data)
{
SBUF = Data;
while(TI == 0);
TI = 0;
}
//串口1发送字符串
void ESP8266_U1_str(u8 *str)
{
while(*str)
{
ESP8266_U1_byte(*str);
str++;
}
}
//串口2发送串口数据(字节)
void ESP8266_U2_byte(u8 Data)
{
S2BUF = Data; //写数据到UART2数据寄存器
while(!(S2CON&S2TI));
S2CON&=~S2TI;
}
//串口2发送字符串
void ESP8266_U2_str(u8 *s)
{
IE2 = 0x00;
while (*s) //检测字符串结束标志
{
ESP8266_U2_byte(*s++); //发送当前字符
}
IE2 = 0x01;
}
u8 RX_num=0; //接收计数变量
//串口1中断
void Uart1() interrupt 4 using 1
{
ES = 0; //关闭串口1中断
if (RI)
{
RI = 0; //清除RI位
RX_buffer[RX_num] = SBUF;
RX_num++;
if(RX_num>tbuf) RX_num = 0;
}
if (TI)
{
TI = 0; //清除TI位
}
ES = 1; //开启串口1中断
}
//串口2中断
void Uart2() interrupt 8 using 1
{
IE2 = 0x00; //关闭串口2中断
if (S2CON & S2RI)
{
S2CON &= ~S2RI;
RX_buffer[RX_num] = S2BUF;
RX_num++;
if(RX_num>tbuf) RX_num = 0;
}
if (S2CON & S2TI)
{
S2CON &= ~S2TI;
}
IE2 = 0x01; //开启串口2中断
}
比较返回值和预测值是否一致。
//校验处理返回数据
void ESP8266_RECMD(u8 *restr)
{
while(1)
{
if(ESP8266_in_re(restr)==1) {ESP8266_U1_str(RX_buffer);break;}
}
memset(RX_buffer, 0, tbuf);//清缓存数据
RX_num=0; //接收计数变量清0
}
//指定字符串与缓存数组数据进行数据比较
//*p 要比较的指定字符串指针数据
//返回:1 数据一致 0 数据不一致
//输入数据与接收数据比较
u8 ESP8266_in_re(u8 *p)
{
if(strstr(RX_buffer,p)!=NULL)
return 1;
else
return 0;
}
基于11.0592MHz下延时
//@11.0592MHz 1ms
void ESP8266_Delayms(u16 num)
{
unsigned char i, j;
while(num--)
{
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
}
编写AT指令与ESP-01S通信
以下用了三条AT指令:
AT 测试AT启动 响应则返回:OK
AT+CWMODE 选择 WIFI 应用模式 设置成功则返回:OK
AT+CWJAP 加入 AP(连接WIFI) 连接成功则返回:OK
//连接WIFI
void ESP8266_COM_WIFI()
{
ESP8266_U2_str("AT\r\n");
ESP8266_RECMD("OK"); //校验处理返回数据
ESP8266_U2_str("AT+CWMODE=1\r\n");
ESP8266_RECMD("OK");
ESP8266_U2_str("AT+CWJAP=\"K30\",\"88888888\"\r\n");
ESP8266_RECMD("OK");
}
编写AT指令,指挥ESP-01S连接网页
以下用了三条AT指令:
AT+CIPMUX 启动多连接
AT+CIPSTART 建立 TCP 连接或注册 UDP 端口号
AT+CIPSEND 发送数据
下面发送数据,重复发送数据。也不知道为什,当时就发一次,怎么都发不出,找了好久都找不到问题,后来,偶然发现在多发一遍数据就行了。
下面数据处理时,用到C语言库
到苏宁时间网站按F12,录制活动就能找到网页是通过GET方式提交222.218.83.240,响应,返回数据内容。
//连接网址
void ESP8266_COM_TCP()
{
ESP8266_U2_str("AT+CIPMUX=0\r\n");
ESP8266_RECMD("OK"); //校验处理返回数据
ESP8266_U2_str("AT+CIPSTART=\"TCP\",\"222.218.83.240\",80\r\n");
ESP8266_RECMD("OK");
ESP8266_U2_str("AT+CIPSEND=50\r\n");
ESP8266_RECMD(">");
ESP8266_U2_str("GET http://quan.suning.com/getSysTime.do\r\n");
ESP8266_U2_str("GET http://quan.suning.com/getSysTime.do\r\n");
ESP8266_RECMD("SEND OK");
while(1){if(strlen(RX_buffer)>=3) {ESP8266_U1_str(RX_buffer);break;}}
//while(1){if(IE2 =0x00) break;};
}
主函数运行测试
void main()
{
ESP8266_Init();
while(1)
{
ESP8266_COM_WIFI();
ESP8266_COM_TCP();
}
}
成功返回网址数据
ESP-01S确实能连接网页,但步骤有点繁琐,而且在调试时串口经常莫名的卡崩,程序执行完后又会重来,也不太清楚哪里有问题,这个模块我也只是玩了几天后,就不打算在深入了解了,因为要弄联网的建议还是用ESP32。
我编写ESP-01S的文件:
链接:https://pan.baidu.com/s/1naO9_HbH2inwb3PkwgvSXQ?pwd=1234
提取码:1234