单片机——wifi模块:esp初探+esp-01s作为服务器

文章介绍了如何使用AT指令配置ESP-01s模块进行初始设置、入网、工作模式选择,以及如何连接到TCP服务器。在串口、中断和WiFi模块的配合下,实现了设备的自动化连接和数据传输。还讨论了错误处理和优化点,包括当ESP-01s作为服务器时的手动和自动步骤。
摘要由CSDN通过智能技术生成

学习设备

STC-51的板子,CH340烧录器,ESP-01s模块

AT指令:

AT指令集是从终端设备(Terminal Equipment,TE)或数据终端设备(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter,TA)或数据电路终端设备(Data Circuit Terminal Equipment,DCE)发送的。 其对所传输的数据包大小有定义:即对于AT指令的发送,除AT两个字符外,最多可以接收1056个 字符的长度(包括最后的空字符)。 每个AT命令行中只能包含一条AT指令;对于由终端设备主动向PC端报告的URC指示或者response 响应,也要求一行最多有一个,不允许上报的一行中有多条指示或者响应。AT指令以回车作为结 尾,响应或上报以回车换行为结尾。

初始配置

  1. 命令检测通信及模块功能是否正常:AT 返回 OK
  2. 根据说明,使用命令配置波特率,如配置成9600波特率:AT+UART=9600,8,1,0,0

入网设置

设置工作模式

:::info
AT+CWMODE = 3 //1.是station(设备)模式,2是AP(路由)模式,3是双模
返回OK
:::

以设备模式或者双模模式,连接进入自己的路由器网络
:::info
AT+CWJAP = “wifi名字”,“wifi密码”
如果成功,返回以下
WIFI CONNECTEN
WIFI GOT IP
:::
查询IP地址:AT+CIFSR

连接到TCP server

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

image.png

  1. 连接服务器

AT+CIPSTART="协议类型","电脑IP地址",端口号,返回CONNECT和OK就为成功

  1. 发送数据
    :::info
    AT+CIPSEND=4//记得勾选发送新行

huan //记得将发送新行取消勾选
:::

透传

  1. 连接服务器

  2. 开启透传模式:AT+CIPMODE=1

  3. 进入发送数据:AT+CIPSEND

  4. 推出透传:+++

实例:串口+中断+wifi模块

#include "reg52.h"
#include <intrins.h>
#include <string.h>

sfr AUXR = 0x8E;
sbit led1 = P3^7;
sbit led2 = P3^6;

int link_ok = 0;

char arr[12];
char ch_ok[2];

//设置工作模式

//连接进入网络
code char linkWifi[]="AT+CWJAP=\"xiaomi_424\",\"424666233\"\r\n";
//连接服务器
code char linkServer[]="AT+CIPSTART=\"TCP\",\"192.168.31.248\",8880\r\n";
//开启透传
char open[]="AT+CIPMODE=1\r\n";
char push[]="AT+CIPSEND\r\n";

void Delay1000ms()		
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	//AUXR避免辐射
	AUXR = 0x01;
	//设置串行口的工作方式,使能接收串口数据
	SCON = 0x50;
	//设置波特率不加倍
	PCON = 0x10;
	
	//设置定时器模式,8位自动重装
	TMOD &= 0x0F;
	TMOD |= 0x20;
	//设置定时器常数
	TH1 = 0xFD;
	TL1 = 0xFD;
	
	//启动定时器
	TR1 = 1;
	//开启全局中断开关
	EA  = 1;
	//开启串行UART中断
	ES = 1;

}

void sendCh(char ch){
	SBUF = ch;
	while(!TI);//防止字符串还没有发送完毕,SBUF就发生了改变
	TI = 0;
}
//发送字符串
void sendString(char* str){
	while(*str != '\0'){
		sendCh(*str);
		str++;
	}
}

//wifi模块连接网络
void wifiLink(){
	led2 = 0;
	sendString(linkWifi);
	//等待
	while(!link_ok);
	link_ok=0;
	
	sendString(linkServer);
	while(!link_ok);
	link_ok=0;
	
	sendString(open);
	while(!link_ok);
	link_ok=0;
	
	sendString(push);
	while(!link_ok);
	link_ok=0;
	led2 = 1;
}

void main(){
	int mark = 0;
	//配置C51串口的通信方式
	UartInit();
	Delay1000ms();
	//连接wifi;
	wifiLink();
	while(1){
		sendString("huanghaibo\r\n");
		Delay1000ms();
	}
}

void UART_Handle(void) interrupt 4
{
	char tmp;
	static int i=0;
	if(RI){
		RI=0;
		tmp = SBUF;
		if(tmp=='O' || i==1){
			ch_ok[i++]=tmp;
		}
		
		if(tmp == '0'){
			led1 = 0;
		}
	
		if(tmp == '1'){
			led1 = 1;
		}
		
		if(i==2){
			i=0;
			if(ch_ok[0]=='O' && ch_ok[1]=='K'){
				link_ok = 1;
			}
		}
	}
}

思路:

  1. 由前面可以知道,如果想要让esp连接进入网络,那么就需要给esp发送AT指令,对其进行配置,那么,我们就可以再代码中,将具体的命令使用char数组进行存储,然后通过TXD口发送到esp
  2. 使用上一章的sendString()sendCh()函数,通过TXD发送到esp中
  3. 根据串口调试助手可知,当wifi连接上时,会出现如下情况

image.png
那么我们可以根据是否会返回OK来进行网络是否连接完毕进行判断,当返回OK时,才进行下一步,否则一直等待

代码中的code还没有学过,后面的章节再进行了解

优化点

代码中还可以加入错误提醒,也就是当发生错误的时候,也就是如下这种情况的时候,也需要进行处理
image.png
UART_Handle()函数中添加如下

void UART_Handle(void) interrupt 4
{
	char tmp;
	static int i=0;
	static int error_i=0;
	if(RI){
		.................
		if(error_i == 4){
			if(error[0]=='F'&&error[1]=='A'&&error[2]=='I'&&error[3]=='L'){
				int j=0;
				for(; j<5;++j){
					led1=0;
					Delay1000ms();
					led1=1;
					Delay1000ms();
				}
				sendString(restart);
				
			}
			error_i=0;
		}
	}
}

esp-01s作为服务器

手动步骤

  1. 配置成双模或者路由器模式:AT+CWMODE=3/2;

image.png

  1. 使能多链接:AT+CIPMUX=1

image.png

  1. 建立TCPServer:AT+CIPSERVER=1;//默认端口为333

image.png

  1. 发送数据:AT+CIPSEND=0,4;//发送4个字节在连接0通道上

image.png

  1. 断开连接:AT+CIPCLOSE=0

自动步骤参考实例,检测相应的返回就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值