#include <reg52.h>
#include "stc52ser.h"
#include "ASCIIS.h"
#include "esp8266.h"
#define BUFFER_MAX_SIZE 99 //缓冲区大小
unsigned char buffer[BUFFER_MAX_SIZE]; //缓冲区:用于存放从ESP8266接收来的各种信息
//连接到TCP服务器的指令:AT+CIPSTART="TCP","192.168.1.110",1234。后面的CR和NL是AT指令的固定结尾,EOT用于SerialPort_SendData发送时识别结尾。
code unsigned char cmd_connectToTCPServer[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x53, 0x54, 0x41, 0x52, 0x54, 0x3D, 0x22, 0x54, 0x43, 0x50, 0x22, 0x2C, 0x22, 0x31, 0x39, 0x32, 0x2E, 0x31, 0x36, 0x38, 0x2E, 0x31, 0x2E, 0x31, 0x31, 0x30, 0x22, 0x2C, 0x31, 0x32, 0x33, 0x34, CR, NL, EOT};
int counter = 0; //用于ESP8266的执行步骤计数
int writeIndex = 0; //缓冲区写索引
void (*ESP01_Event_WifiConnected)();
void (*ESP01_Event_IpGot)();
void (*ESP01_Event_TcpServerConnected)();
void (*ESP01_Event_MsgReceived)(unsigned char* head);
//注意:下面代码推荐从后往前看,从注释标"1. "处开始。
void prepareForData(unsigned char byte); //因为第四步和第三步会相互调用,所以这里只是做了个声明(C语言的矫情点)。
//4. 将信息插入到缓冲区并送给单片机。
void insertDataIntoBuffer(unsigned char byte){
if(byte == '\\'){
//检测到'\'后,将信息送出到单片机
buffer[writeIndex] = '\0';
(*ESP01_Event_MsgReceived)(buffer);
SerialPort_Event_ByteReceived = &prepareForData; //回到第三步,准备接收下一条信息
writeIndex = 0;
return;
}
buffer[writeIndex++] = byte;
}
//3. 准备信息:这里是过度步骤,前面可以观察到,ESP8266在接收发来的信息时是有个头的,这里的作用就是去头。
void prepareForData(unsigned char byte){
if(byte == ':'){
SerialPort_Event_ByteReceived = &insertDataIntoBuffer;
writeIndex = 0;
}
}
//识别回馈指令:用于识别接收到的是WIFI CONNECTED(连上热点)还是WIFI IP GOT(获得IP)还是CONNECT(连上TCP服务器)
void parseCmd()
{
switch(counter)
{
case 1:
if(buffer[0] == 'W' && buffer[5] == 'C'){
(*ESP01_Event_WifiConnected)();
counter += 1;
}
break;
case 2:
if(buffer[0] == 'W' && buffer[5] == 'G'){
(*ESP01_Event_IpGot)();
counter += 1;
}
break;
case 3:
if(buffer[0] == 'A' && buffer[3] == 'C')
counter += 1;
break;
case 4:
if(buffer[0] == 'C' && buffer[3] == 'N' && buffer[6] == 'T'){
(*ESP01_Event_TcpServerConnected)();
SerialPort_Event_ByteReceived = &prepareForData; //连接到TCP服务器后,进入第三步。
}
}
}
//2. 这里开始向缓冲区存储信息,用于识别。
void insertBuffer(unsigned char byte)
{
if(byte == NL)
{
//收到尾(NL)后,将缓冲区的回馈信息送去识别
parseCmd();
writeIndex = 0;
return;
}
buffer[writeIndex++] = byte;
}
//1. 接收头:头是无用信息,但我们要通过头里面的一些字符,推算出什么时候到达第二步(WIFI CONNECTED)
void headerReceived(unsigned char byte)
{
if(byte == NL)
{
//头内有5个NL,只要数够5个,下一个就是第二步的内容了。
if(++counter == 5)
{
SerialPort_Event_ByteReceived = &insertBuffer; //跳到第二步
counter = 1;
}
}
}
//同.h中的声明
void ESP01_Init()
{
SerialPort_Init_Low();//9600
//SerialPort_Init_High();//115200
SerialPort_Event_ByteReceived = &headerReceived; //事件注册
}
//同.h中的声明
void ESP01_ConnectToTCPServer()
{
SerialPort_SendData(cmd_connectToTCPServer);
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于51单片机的8266物联网代码.rar
共24个文件
c:5个
lst:4个
obj:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 4 下载量 69 浏览量
2021-09-07
20:27:07
上传
评论
收藏 43KB RAR 举报
温馨提示
基于51单片机的8266物联网代码
资源推荐
资源详情
资源评论
收起资源包目录
基于51单片机的8266物联网代码.rar (24个子文件)
基于51单片机的8266物联网代码
main.c 872B
wifi.uvproj 15KB
wifi.uvopt 7KB
Objects
esp8266.obj 9KB
wifi 21KB
stc52ser.obj 6KB
wifi.lnp 168B
lcd1602.obj 6KB
main.obj 4KB
wifi.build_log.htm 1KB
User
8266
esp8266.c 4KB
esp8266.h 453B
LCD1602
lcd1602.h 299B
lcd1602.c 2KB
ASCII
ASCIIS.h 1KB
ascii.c 0B
stc52ser
stc52ser.c 2KB
stc52ser.h 407B
wifi.uvgui.SLY 92KB
Listings
stc52ser.lst 4KB
main.lst 2KB
lcd1602.lst 4KB
esp8266.lst 6KB
wifi.m51 21KB
共 24 条
- 1
资源评论
- 江口小牛2023-04-26资源内容详实,描述详尽,解决了我的问题,受益匪浅,学到了。
- weixin_431615572022-07-19资源很实用,对我启发很大,有很好的参考价值,内容详细。
- llf01162021-09-17用户下载后在一定时间内未进行评价,系统默认好评。
- Jklovin2022-02-24用户下载后在一定时间内未进行评价,系统默认好评。
风和技术资料库
- 粉丝: 37
- 资源: 925
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功