历史上的今天
返回首页

历史上的今天

今天是:2025年10月25日(星期六)

正在发生

2022年10月25日 | 【51单片机STC89C52】ESP8266 ESP-01S模块使用

2022-10-25 来源:csdn

一、部分AT指令

image.png?imageView2/2/w/550

image.png?imageView2/2/w/550

注意:AT指令,控制类勾选发送新行,传输数据时不需要


二、建立TCP服务器

注:ESP-01S和主机要在同一wifi网络下

三、编程实现设备模式接入路由器配置

1、编程分析

ESP-01S连接网络后重启自动连接网络,并且返回WIFI GOT IP。


这里暂不考虑联网失败,后面再通过AT指令再次联网就可以。

以设备模式接入路由器配置,发送AT+CWJAP="OnePlus9R","qwertyuiop"指令 


入网成功返回WIFI GOT IP等,最终返回值为OK


入网失败返回值为FAIL

连接到 TCP server,发送AT+CIPSTART="TCP","192.168.67.162",8880指令


开启透传模式,发送AT+CIPMODE=1指令


开始发送接收数据,发送AT+CIPSEND指令


以上操作成功的话,返回值均为OK


连接 TCP 服务器失败,返回ERROR等,最终返回值为CLOSED,但是代码并未考虑

2、代码分析

 指令

code char LJWL[]  = "AT+CWJAP="OnePlus9R","qwertyuiop"rn";   //连接网络

code char LJFWQ[] = "AT+CIPSTART="TCP","192.168.67.162",8880rn";//连接服务器

char TCMS[]  = "AT+CIPMODE=1rn";  //透传模式指令

char SJCS[]  = "AT+CIPSENDrn"; //数据传输开始指令

char RESET[] = "AT+RSTrn"; //重启模块指令

返回值标志位

char AT_OK_Flag = 0; //OK返回值的标志位

char AT_Connect_Net_Flag = 0; //WIFI GOT IP返回值的标志位

中断处理服务函数

void Uart_Handler() interrupt 4

{

static int i = 0;//静态变量,被初始化一次

char tmp;

 

if(RI)//中断处理函数中,对于接收中断的响应

{

RI = 0;//清除接收中断标志位

tmp = SBUF;

if(tmp == 'W' || tmp == 'O' || tmp == 'F' || tmp == 'L'){

i = 0;

}

buffer[i++] = tmp;

if(buffer[0] == 'W' && buffer[5] == 'G'){ //入网成功的判断依据WIFI GOT IP

AT_Connect_Net_Flag = 1;

memset(buffer, '', SIZE);

}

if(buffer[0] == 'O' && buffer[1] == 'K'){ //连接服务器等OK返回值指令的判断

AT_OK_Flag = 1;

memset(buffer, '', SIZE);

}

if(buffer[0] == 'F' && buffer[1] == 'A'){ //联网失败出现FAIL字样

for(i=0;i<5;i++){

D5 = 0;

Delay1000ms();

D5 = 1;

Delay1000ms();

}

sendString(RESET);

memset(buffer, '', SIZE);

}

if(buffer[0] == 'L' && buffer[2] == '1'){ //灯控指令

D5 = 0;//点亮D5

memset(buffer, '', SIZE);

}

if(buffer[0] == 'L' && buffer[2] == '0'){

D5 = 1;//熄灭D5

memset(buffer, '', SIZE);

}

if(i == 12) i = 0;

}

}


主函数

void main()

{

int mark = 0;

D5 = 1;

D6 = 1;//灭状态灯

 

UartInit();

Delay1000ms();//给espwifi模块上电时间

sendString(LJWL);//发送联网AT指令并等待成功

//while(!AT_Connect_Net_Flag);

while(!AT_OK_Flag);

AT_OK_Flag = 0;

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){

Delay1000ms();//“心跳包”

sendString("连接成功rn");

}

}


3、整体代码

#include "reg52.h"

#include "intrins.h"

#include

 

#define SIZE 12

sfr AUXR = 0x8E;

sbit D5 = P3^7;

sbit D6 = P3^6;

char buffer[SIZE];

 

code char LJWL[]  = "AT+CWJAP="OnePlus9R","qwertyuiop"rn";   //连接网络

code char LJFWQ[] = "AT+CIPSTART="TCP","192.168.67.162",8880rn";//连接服务器

char TCMS[]  = "AT+CIPMODE=1rn";  //透传模式指令

char SJCS[]  = "AT+CIPSENDrn"; //数据传输开始指令

char RESET[] = "AT+RSTrn"; //重启模块指令

 

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 &= 0xF0;

TMOD |= 0x20; //定时器1工作方式位8位自动重装

TH1 = 0xFD;

TL1 = 0xFD; //9600波特率的初值

TR1 = 1; //启动定时器

EA = 1; //开启总中断

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;

while(!TI);

TI = 0;

}

 

void sendString(char* str)

{

while( *str != ''){

sendByte(*str);

str++;

}

}

 

void main()

{

int mark = 0;

D5 = 1;

D6 = 1;//灭状态灯

 

UartInit();

Delay1000ms();//给espwifi模块上电时间

sendString(LJWL);//发送联网AT指令并等待成功

//while(!AT_Connect_Net_Flag);

while(!AT_OK_Flag);

AT_OK_Flag = 0;

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){

Delay1000ms();//“心跳包”

sendString("连接成功rn");

}

}

 

void Uart_Handler() interrupt 4

{

static int i = 0;//静态变量,被初始化一次

char tmp;

 

if(RI)//中断处理函数中,对于接收中断的响应

{

RI = 0;//清除接收中断标志位

tmp = SBUF;

if(tmp == 'W' || tmp == 'O' || tmp == 'F' || tmp == 'L'){

i = 0;

}

buffer[i++] = tmp;

if(buffer[0] == 'W' && buffer[5] == 'G'){ //入网成功的判断依据WIFI GOT IP

AT_Connect_Net_Flag = 1;

memset(buffer, '', SIZE);

}

if(buffer[0] == 'O' && buffer[1] == 'K'){ //连接服务器等OK返回值指令的判断

AT_OK_Flag = 1;

memset(buffer, '', SIZE);

}

if(buffer[0] == 'F' && buffer[1] == 'A'){ //联网失败出现FAIL字样

for(i=0;i<5;i++){

D5 = 0;

Delay1000ms();

D5 = 1;

Delay1000ms();

}

sendString(RESET);

memset(buffer, '', SIZE);

}

if(buffer[0] == 'L' && buffer[2] == '1'){ //灯控指令

D5 = 0;//点亮D5

memset(buffer, '', SIZE);

}

if(buffer[0] == 'L' && buffer[2] == '0'){

D5 = 1;//熄灭D5

memset(buffer, '', SIZE);

}

if(i == 12) i = 0;

}

}


四、ESP-01S AP(路由)模式

1、AP模式配置

2、接收数据

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

3、编程实现AP模式

#include "reg52.h"

#include "intrins.h"

#include


#define SIZE 12

sfr AUXR = 0x8E;

sbit D5 = P3^7;

sbit D6 = P3^6;

 

char buffer[SIZE];

 

char LYMO[] = "AT+CWMODE=2rn"; //工作在路由模式

char DLJ[] = "AT+CIPMUX=1rn"; //使能多链接

char JLFW[] = "AT+CIPSERVER=1rn"; //建立TCPServer,default port = 333 

char FSSJ[] = "AT+CIPSEND=0,5rn"; //发送数据

 

char AT_OK_Flag = 0; //OK返回值的标志位

char AT_Connect_Net_Flag = 0; //WIFI GOT IP返回值的标志位

char Client_Connect_Flag = 0;

 

void UartInit(void) //9600bps@11.0592MHz

{

AUXR = 0x01;

SCON = 0x50; //配置串口工作方式1,REN使能接收

TMOD &= 0xF0;

TMOD |= 0x20; //定时器1工作方式位8位自动重装

TH1 = 0xFD;

TL1 = 0xFD; //9600波特率的初值

TR1 = 1; //启动定时器

EA = 1; //开启总中断

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;

while(!TI);

TI = 0;

}

 

void sendString(char* str)

{

while( *str != ''){

sendByte(*str);

str++;

}

}

 

void main()

{

D5 = 1;

D6 = 1;//灭状态灯

 

UartInit();

Delay1000ms();//给espwifi模块上电时间

sendString(LYMO);//工作在路由模式

while(!AT_OK_Flag);

AT_OK_Flag = 0;

sendString(DLJ);//使能多链接

while(!AT_OK_Flag);

AT_OK_Flag = 0;

sendString(JLFW);//建立TCPServer

while(!Client_Connect_Flag){

D6 = 0;

Delay1000ms();

D6 = 1;

Delay1000ms();

}

 

if(Client_Connect_Flag){

D6 = 0;//点亮D6,代表有客户端接入

}

while(1){

sendString(FSSJ);//发送数据

Delay1000ms();

Delay1000ms();

sendString("Hello");

Delay1000ms();

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' || tmp == '0' || tmp == ':'){

i = 0;

}

buffer[i++] = tmp;

if(buffer[0] == 'W' && buffer[5] == 'G'){//入网成功的判断依据WIFI GOT IP

AT_Connect_Net_Flag = 1;

memset(buffer, '', SIZE);

}

if(buffer[0] == 'O' && buffer[1] == 'K'){//连接服务器等OK返回值指令的判断

AT_OK_Flag = 1;

memset(buffer, '', SIZE);

}

if(buffer[0] == '0' && buffer[2] == 'C'){//连接成功返回值0,CONNECT的判断

Client_Connect_Flag = 1;

memset(buffer, '', SIZE);

}

//灯控指令

if(buffer[0] == ':' && buffer[1] == 'o' && buffer[2] == 'p'){

D5 = 0;//点亮D5 

memset(buffer, '', SIZE);

}

if(buffer[0] == ':' && buffer[1] == 'c' && buffer[2] == 'l'){

D5 = 1;//熄灭D5

memset(buffer, '', SIZE);

}

if(i == 12) i = 0;

}

}

推荐阅读

史海拾趣

Circuit Technology Inc公司的发展小趣事

面对电子行业的快速变化和技术更新,CTI始终保持敏锐的洞察力。公司不断加大研发投入,引进高端人才,建立研发团队,致力于开发具有自主知识产权的新技术、新产品。通过不断创新,CTI成功推出了一系列具有竞争力的新产品,不仅满足了市场需求,也提升了公司的核心竞争力。

DCD [Digital Core Design]公司的发展小趣事

随着技术的不断成熟和产品线的日益丰富,DCD公司开始着手拓展市场。公司积极参与各类行业展会,与国内外客户建立了广泛的联系。同时,公司还加大了品牌推广力度,通过线上线下多种渠道提高品牌知名度。经过几年的努力,DCD公司的产品在市场上逐渐获得了认可,公司也因此在电子行业中崭露头角。

Helicomm公司的发展小趣事

随着技术的不断成熟和产品线的日益丰富,DCD公司开始着手拓展市场。公司积极参与各类行业展会,与国内外客户建立了广泛的联系。同时,公司还加大了品牌推广力度,通过线上线下多种渠道提高品牌知名度。经过几年的努力,DCD公司的产品在市场上逐渐获得了认可,公司也因此在电子行业中崭露头角。

台湾致强(FORT)公司的发展小趣事

致强科技深知员工是企业持续发展的关键。因此,公司自成立以来便注重企业文化的建设,积极营造和谐、关爱的工作氛围。公司管理层倡导“尊重人性”的理念,不仅为员工提供具有竞争力的薪酬福利,还通过EAP(员工协助计划)等方式关注员工的心理健康和生活需求。EAP项目的实施不仅帮助员工缓解了工作压力,还从多方面提升了员工的归属感和幸福感,为公司的长期发展奠定了坚实的人才基础。

捷茂微(GATEMODE)公司的发展小趣事

在追求企业发展的同时,致强科技始终不忘对环境的责任。公司积极响应环保法规要求,将环保理念融入产品研发、生产和销售的各个环节。通过采用环保材料、优化生产流程、实施节能减排等措施,致强科技有效降低了产品对环境的负面影响。此外,公司还定期评估并符合最新的环保法规要求,确保企业与消费者的价值观和环境保护目标相一致。

bb-smartworx公司的发展小趣事

在追求企业发展的同时,致强科技始终不忘对环境的责任。公司积极响应环保法规要求,将环保理念融入产品研发、生产和销售的各个环节。通过采用环保材料、优化生产流程、实施节能减排等措施,致强科技有效降低了产品对环境的负面影响。此外,公司还定期评估并符合最新的环保法规要求,确保企业与消费者的价值观和环境保护目标相一致。

问答坊 | AI 解惑

九天论道-论电子工程师的论坛情结(转)

[ 引子 ] 电子工程师,大凡耕作于电脑之上,劳顿于芯片之间。遇有困难之处,难免抓耳挠腮,四方测试未果,只好求助论坛。电子论坛的兴起,早期大概就是为了满足个人技术问题的解决,最终由于人数的增加而发展成势,最后成了一个产业,也造就了我们 ...…

查看全部问答>

DCDC buck较低电压上电过程电感有叫声

请教各位: 我们在测试一个DCDC的buck时,发现在低电压上电时,电感有叫声,而且整个环路工作不稳定,但是在较高电压上电过程中没有发现这种问题,而且,在大电流输出的情况下也没有发现这种现象,请问这是为什么?…

查看全部问答>

wince中怎么处理IRQ3

我想做个当有IRQ3产生时就SUSPEND的程序,不知道应该如何实现? 用EVC写应用程序?该如何判断是否有IRQ3产生呢,跪谢!…

查看全部问答>

传感器实用电路150例(强鉴)

本帖最后由 paulhyde 于 2014-9-15 03:38 编辑 是本书,但字不是非常清晰,有需要的朋友可以下来看看  …

查看全部问答>

关于fpga能做什么的几个小白问题?

大家好,初来贵地多多包涵。 事情是这样的,我们是一家金融软件提供商(windows平台),随着软件功能越来越复杂,计算速度感觉越来越慢,我们老总今天不知道从哪儿打听到了fpga这个东西,说是可以将复杂的计算代码烧在板子上,通过插卡的方式,大幅 ...…

查看全部问答>

LaunchPad制作的遥控LED台灯完成

小弟刚刚开始学习MSP430,前段时间有幸团购一块LaunchPad开发板,最近拿出来做了一个遥控的LED灯 我选用的主控芯片是G2231;驱动芯片是TI申请的5917,设计电流档位15个;遥控本来想用红外,可惜能理有限,最后采用模块 想拍个视频给大家,不太会 ...…

查看全部问答>

我买的EK-LM4F120XL板寄给了别人怎么办?

在TI买的EK-LM4F120XL - Stellaris® LM4F120 LaunchPad 板。Ship Date: 11/19/2012 前天发了个查询,今天给我回了邮件,给了快递号(Shipped FedEx# is  876383869337),但一查,签收了 谁帮我写个回信啊,我的英 ...…

查看全部问答>

新手关于开发板的咨询

最近心血来潮想玩玩板子,以前学校有430G2 LaunchPad所以上手过,简单的流水灯之类的程序能写出来,求各位前辈指点下,我现在应该玩些什么类型的板子,并且有哪位大大能便宜出手么?…

查看全部问答>

可以搞个贴片样片本的活动

eeworld可以搞个以0402 0603 0805阻容感之类做奖品的活动,即可以满足广大硬件工程师的需要,又可以给厂家做推厂。样品不在多全,常用的即可。估计大家手里有的,多数都是国巨,村田之类牌子的,这些东西,国产和台产的也不错。如果能有厂家赞助 ...…

查看全部问答>