透传就是手机连接上蓝牙,发送文本给蓝牙,蓝牙又传送给电脑。
发送:TX
接收:RX
AT指令时勾选新行,发送数据时去掉新行。
SBUF每次只能存储一个字节,如果是字符串的话,那就一个字符一个字符的去发送,,然后先把接收到的放入缓存,完全发送完毕再进行处理
ESP-01s出厂波特率正常是115200
设置ESP8266为9600波特率:AT+UART=9600,8,1,0,0
AT+CWMODE=3 //1. 是station(设备)模式 2.是AP(路由)模式 3.是双模
以设备模式接入家里路由器:AT+CWJAP=“9527”,“12345678” //指令
查询IP地址:AT+CIFSR
让WIFI作为设备端接入这个服务器AT+CIPSTART=“TCP”,“192.168.10.102”,8888
开启成功则返回WIFI CONNECTED //结果 WIFI GOT IP //结果 OK
AT+CIPMODE=1 //开启透传模式
AT+CIPSEND //带回车 Response: > //这个时候随意发送接收数据
+++退出透传模式
!!!发送数据不带新行,发送指令带新行。
总结:让ESP8266接入家里的设备,分为以下几个步骤:
(1)初始化ESP8266串口波特率为9600。
(2)设置ESP8266为双模工作模式。
(3)让ESP8266以设备模式连接上家里的网络。
(4)在网络调试助手里面设置家里的电脑WIFI为服务器模式(这里电脑和ESP8266均要连接同一个无线网络,都要2.4G),让ESP8266作为设备连接到这个服务器上面。
(5)开始发送数据。
#include "reg52.h"
#include "intrins.h"
#include <string.h>
#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;
char buffer[SIZE];
code char LJWL[] = "AT+CWJAP=\"9527\",\"12345678\"\r\n"; //入网指令
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.16.102\",6666\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;//开启总中断
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 != '\0'){
sendByte(*str);
str++;
}
}
void main()
{
D5 = D6 = 1;//灭状态灯
UartInit();//串口初始化
Delay1000ms();//给espwifi模块上电时间
sendString(LJWL);//发送联网AT指令并等待成功
while(!AT_OK_Flag);//!!!注意这里连接网络成功后ESP回复的指令
AT_OK_Flag = 0;//每次用完赋值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);
//AT_Connect_Net_Flag仅检测网络是否连接成功,
//AT_OK_Flag检测所有指令是否执行成功
if(AT_Connect_Net_Flag)
{
D5 = 0;//点亮D5,代表入网成功
}
if(AT_OK_Flag)
{
D6 = 0;//点亮D6,代表连接服务器并打开透传模式成功
}
while(1)
{
Delay1000ms();//“心跳包”
sendString("TWOTHREE23\r\n");
}
}
void Uart_Handler() interrupt 4
{
static int i = 0;//静态变量,被初始化一次
char tmp;
if(RI)//中断处理函数中,对于接收中断的响应
{
RI = 0;//清除接收中断标志位
tmp = SBUF;
if(tmp == 'W' || tmp == 'O' || tmp == 'Q' || tmp == 'F'){
i = 0;
}
buffer[i++] = tmp;//每次接受一个字母存入BUFFER寄存器,不断地往这里存数据
if(buffer[0] == 'W' && buffer[5] == 'G')//入网成功的判断依据WIFI GOT IP
{
AT_Connect_Net_Flag = 1;
memset(buffer, '\0', SIZE);//字符串用完记得初始化
}
//连接服务器等OK返回值指令的判断这里只有联网成功返回是WIFI GOT IP,其他都是OK
if(buffer[0] == 'O' && buffer[1] == 'K')
{
AT_OK_Flag = 1;
memset(buffer, '\0', 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, '\0', SIZE);
}
if(buffer[0] == 'Q' && buffer[2] == '1')
{
D5 = 0;//点亮D5
memset(buffer, '\0', SIZE);
}
if(buffer[0] == 'Q' && buffer[2] == '0')
{
D5 = 1;//熄灭D5
memset(buffer, '\0', SIZE);
}
if(i == 12) i = 0;//如果最后一直接收指令越界了,就回到数组头
}
}
我们通过51单片机控制ESP8266的基本思路是:通过52的TX口给ESP的RX口发出指令,ESP收到指令后会有一个回复指令,我们能通过白盒测试,让ESP的TX口连接USB–TTL的RX口,从而在ESP收到单片机指令后,自身有一个回复指令,这个回复指令发送给电脑端的串口,串口接收,在电脑上实现数据可视化。
二、设置ESP8266为服务器模式
三、通过4G让单片机进行上网
入网步骤:
在测试之前,将电源、天线、SIM 卡、串口线等硬件连接好。
- 打开串口连接4G模块,串口出产默认波特率是115200,可以自行根据用户手册修改
- 进入AT指令模式,在串口助手内发送+++(不要勾选发送新行),必须在发送+++指令 3s 内发送其
他任意 AT 指令,比如AT+CPIN - 观察SIM卡灯是否亮起,AT+ICCID获得SIM卡信息,确认SIM卡安装完好 返回数据:
1. +OK=89860620240009502942
检查信号是否正常,通过AT+CSQ指令检查信号值,建议插入信号天线,返回数据:+OK=31
AT+REBT:重启4G模块
AT+UART=9600,NONE:设置9600波特率,无校验位
AT+HEARTM=30//设置心跳包发送时间为30S
AT+HEARTINFO=1,SGN01//先设置完心跳包发送时间,后设置心跳包发送内容
- AT+SOCK=TCPC,103.46.128.53,34207 连接socket服务器,这里的IP地址是花生壳端IP映射地址,端口号是花生壳端生成的端口号,参数之间逗号隔开
- AT+LINKSTA查看连接状态,如果第四步没有问题,此时串口返回+OK=Connect
- //连接失败时多检查检查天线是否合理
#include <reg52.h>
#include <string.h>
char cmd;
char buffer[12];
sbit LED1 = P3^6;
sbit LED2 = P3^7;
sfr AUXR = 0x8E;
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
TR1 = 1; //启动定时器1
EA = 1;//打开总中断
ES = 1;//打开串口中断
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void SendChar(char Data_msg)
{
SBUF = Data_msg;
while(!TI);//发送是主动,的那个要发送东西时,TI为1
TI = 0;
}
void SendStr(char* Str)
{
while(*Str != '\0')
{
SendChar(*Str);//发送单字符
Str++;
}
}
void main()
{
LED2 = LED1 = 1;
UartInit();
while(1)
{
Delay1000ms();
SendStr("9527 you dian shuai\r\n");
}
}
void uart_handler() interrupt 4 //串口中断
{
static int i=0;
cmd=SBUF;
if(RI)
{
RI=0;
if(cmd == ':')
{
i = 0;
}
buffer[i++] = cmd;//每次接受一个字母存入BUFFER寄存器,不断地往这里存数据
if(buffer[0]== ':' && buffer[1] == 'o' && buffer[2]=='p')//入网成功的判断依据WIFI GOT IP
{
LED2 = LED1 = 0;
i = 0;
memset(buffer, '\0', 12);//字符串用完记得初始化
}
if(buffer[0]== ':' && buffer[1] == 'c' && buffer[2]=='l')//入网成功的判断依据WIFI GOT IP
{
LED2 = LED1 = 1;
i = 0;
memset(buffer, '\0', 12);//字符串用完记得初始化
}
if(i==12)i = 0;
}
if(TI);
}