学习设备
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指令以回车作为结 尾,响应或上报以回车换行为结尾。
初始配置
- 命令检测通信及模块功能是否正常:AT 返回 OK
- 根据说明,使用命令配置波特率,如配置成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
- 开关网络助手,设立TCP服务器
- 连接服务器
AT+CIPSTART="协议类型","电脑IP地址",端口号
,返回CONNECT和OK就为成功
- 发送数据
:::info
AT+CIPSEND=4//记得勾选发送新行
huan //记得将发送新行取消勾选
:::
透传
-
连接服务器
-
开启透传模式:
AT+CIPMODE=1
-
进入发送数据:
AT+CIPSEND
-
推出透传:+++
实例:串口+中断+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;
}
}
}
}
思路:
- 由前面可以知道,如果想要让
esp
连接进入网络,那么就需要给esp
发送AT
指令,对其进行配置,那么,我们就可以再代码中,将具体的命令使用char数组
进行存储,然后通过TXD
口发送到esp
中 - 使用上一章的
sendString()
和sendCh()
函数,通过TXD
发送到esp中 - 根据串口调试助手可知,当wifi连接上时,会出现如下情况
那么我们可以根据是否会返回OK
来进行网络是否连接完毕进行判断,当返回OK
时,才进行下一步,否则一直等待
代码中的code还没有学过,后面的章节再进行了解
优化点
代码中还可以加入错误提醒,也就是当发生错误的时候,也就是如下这种情况的时候,也需要进行处理
在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作为服务器
手动步骤
- 配置成双模或者路由器模式:
AT+CWMODE=3/2
;
- 使能多链接:
AT+CIPMUX=1
;
- 建立TCPServer:
AT+CIPSERVER=1
;//默认端口为333
- 发送数据:
AT+CIPSEND=0,4
;//发送4个字节在连接0通道上
- 断开连接:
AT+CIPCLOSE=0
;