标题:
为什么esp8266连上去了我用按键控制的值就会乱,esp8266都没接电源呀
[打印本页]
作者:
我只想弄下程序
时间:
2021-9-12 15:56
标题:
为什么esp8266连上去了我用按键控制的值就会乱,esp8266都没接电源呀
如题
作者:
188610329
时间:
2021-9-12 16:48
如果,程序中有读其它设备值得指令, 当目标设备没有通电时,大概率读到值会是任意值,这是数电的正常现象,所以才会通过 上拉,或下拉 电阻,来避免这种情况。
作者:
devcang
时间:
2021-9-13 08:35
电路连接、程序,是如何的
作者:
我只想弄下程序
时间:
2021-9-19 11:25
#include<reg51.h>
#include"lcd.h"
#include "esp8266.h"
#include "uart.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
ulong volt;//测量的电压值
uint vtime; // 用来控制测量地址位的改变
uchar addr;//测量地址位,指示测量的是哪一个模拟值 (其实就是TLC2543的控制字)
sbit CLK=P1^7;//定义时钟信号口
sbit DIN=P1^6;//定义2543数据写入口
sbit DOUT=P1^5;//定义2543数据读取口
sbit CS=P1^4;//定义2543片选信号口
sbit k0=P2^4; //定义P24口是k1
sbit k1=P2^5; //定义P25口是k0
sbit l1=P2^6;
sbit l2=P2^7;
int g=2,h=4;
u8 rxdata;
u8 i=0;
u8 a[2]={1,4};
float f;
/**********************************************************/
//函数名:delay(uint x)
//功能:延时程序 改变测量地址
//调用函数:
//输入参数:x
//输出参数:
//说明:
/**********************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : keypros
* 函数功能 : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void keypros()
{
if(k0==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k0==0) //再次判断按键是否按下
{
h++;
if(h==10)
{
g++;
h=0;
}
}
while(!k0); //检测按键是否松开
}
if(k1==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k1==0) //再次判断按键是否按下
{
h--;
if(h<0)
{
g--;
h=9;
}
}
while(!k1); //检测按键是否松开
}
}
/**********************************************************/
//函数名:read2543(uchar addr)
//功能:2543驱动程序
//调用函数:
//输入参数:addr
//输出参数:
//说明:进行ad转换将结果存于volt变量中 addr为测量位地址
/**********************************************************/
void read2543(uchar addr)
{
uint ad=0;
uchar i;
CLK=0;
CS=0;//片选段,启动2543
addr<<=4;//对地址位预处理
for(i=0;i<12;i++) //12个时钟走完,完成一次读取测量
{
if(DOUT==1)
ad=ad|0x01;//单片机读取ad数据
DIN=addr&0x80;//2543读取测量地址位
CLK=1;
;;;//很短的延时
CLK=0;//产生下降沿,产生时钟信号
;;;
addr<<=1;
ad<<=1;//将数据移位准备下一位的读写
}
CS=1;//关2543
ad>>=1;
volt=ad;//取走转换结果
volt=volt*1221;//例子的满量程为5V,转换分辩率为12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表实际1221mV
}
/**********************************************************/
//函数名:display()
//功能:5位数码管显示
//调用函数:delay(uint x)
//输入参数:
//输出参数:
//说明:将处理后的电压值与测量位值显示在5位数码管上
/**********************************************************/
void display()
{
int a,b,c;
LcdWriteCom(0xC4); //写地址 C0表示初始地址
LcdWriteData('0'+g);
LcdWriteCom(0xC6); //写地址 C0表示初始地址
LcdWriteData('0'+h);
if(addr==0)
{
a = volt/1000000;
b=(volt/100000)%10;
c=(volt/10000)%10;
LcdWriteCom(0x84); //写地址 80表示初始地址
LcdWriteData('0'+a); //百位
LcdWriteCom(0x86); //写地址 80表示初始地址
LcdWriteData('0'+b); //十位
LcdWriteCom(0x87); //写地址 80表示初始地址
LcdWriteData('0'+c); //十位
SBUF = 's';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = 'e';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = 't';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = ';';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0'+g;//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '.';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0'+h;//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = 'V';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '\r';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '\n';//将接收到的数据放入到发送寄存器
while (!TI);
TI = 0;
if(a>=g)
{
if(b>=h)l1=1;
else l1=0;
}
else l1=0;
SBUF = 'V';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = ';';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0'+a;//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '.';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0'+b;//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0'+c;//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = ' ';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '-';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '5';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = 'V';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
}
if(addr==1)
{
a = volt*2/1000000;
b = (volt*2/100000)%10;
c=(volt*2/10000)%10;
LcdWriteCom(0x89); //写地址 80表示初始地址
LcdWriteData('0'+a); //百位
LcdWriteCom(0x8B); //写地址 80表示初始地址
LcdWriteData('0'+b); //十位
LcdWriteCom(0x8C); //写地址 80表示初始地址
LcdWriteData('0'+c); //十位
if(a>=g)
{
if(b>=h)l2=1;
else l2=0;
}
else l2=0;
SBUF = 'V';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = ';';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0'+a;//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '.';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0'+b;//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0'+c;//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = ' ';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '0';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '-';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '8';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = 'V';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '\r';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '\n';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
}
SBUF = '\r';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = '\n';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
}
/*******************************************************************************
* 函 数 名 :UsartConfiguration()
* 函数功能 :设置串口
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
/**********************************************************/
//主程序
/**********************************************************/
void main()
{
LcdInit(); //初始化LCD1602
LcdWriteCom(0x80); //写地址 80表示初始地址
LcdWriteData('M');
LcdWriteCom(0x81); //写地址 80表示初始地址
LcdWriteData('e');
LcdWriteCom(0x82); //写地址 80表示初始地址
LcdWriteData('a');
LcdWriteCom(0x83); //写地址 80表示初始地址
LcdWriteData(':');
LcdWriteCom(0x85); //写地址 80表示初始地址
LcdWriteData('.');
LcdWriteCom(0x8A); //写地址 80表示初始地址
LcdWriteData('.');
LcdWriteCom(0xC0); //写地址 C0表示初始地址
LcdWriteData('S');
LcdWriteCom(0xC1); //写地址 C0表示初始地址
LcdWriteData('e');
LcdWriteCom(0xC2); //写地址 C0表示初始地址
LcdWriteData('t');
LcdWriteCom(0xC3); //写地址 C0表示初始地址
LcdWriteData(':');
LcdWriteCom(0xC5); //写地址 C0表示初始地址
LcdWriteData('.');
LcdWriteCom(0xC8); //写地址 C0表示初始地址
LcdWriteData('0');
LcdWriteCom(0xC9); //写地址 C0表示初始地址
LcdWriteData('-');
LcdWriteCom(0xCA); //写地址 C0表示初始地址
LcdWriteData('5');
LcdWriteCom(0xCB); //写地址 C0表示初始地址
LcdWriteData('V');
LcdWriteCom(0xCC); //写地址 C0表示初始地址
LcdWriteData('0');
LcdWriteCom(0xCD); //写地址 C0表示初始地址
LcdWriteData('-');
LcdWriteCom(0xCE); //写地址 C0表示初始地址
LcdWriteData('8');
LcdWriteCom(0xCF); //写地址 C0表示初始地址
LcdWriteData('V');
UsartConfiguration();
while(1)
{
read2543(addr);//调用2543驱动程序测量地址为0
display();//调用显示程序
keypros();
ESP8266_Task();
addr++;
if(addr==2)
addr=0;
}
}
extern void ESP8266_ReceiveData(unsigned char rxdata);
void Usart() interrupt 4
{
if(RI)
{
rxdata=SBUF;//出去接收到的数据
if(rxdata>='0'&&rxdata<='9')
{
a[i]=rxdata;
i++;
if(i==2)i=0;
}
g=a[0]-'0';
h=a[1]-'0';
RI = 0;//清除接收中断标志位
ESP8266_ReceiveData(rxdata);
}
}
//定时器0 中断服务函数 中断编号 1
extern void ESP8266_RxDataUnlock(void);
void Timer0_ISR(void) interrupt 1 //20ms定时
{
TL0 = 0x00; //设置定时初值
TH0 = 0xB8; //设置定时初值
//------------------中断处理---------------------
ESP8266_RxDataUnlock();
}
void SendData(void) //发送数据
{
static unsigned char con=0;
unsigned int integ=0; //2.35 235
con++;
if(con>=20)
{
con=0;
if(addr==0)
{
ESP8266_TxBuf[0]='U'; //buf缓存区,缓存寄存器吧
ESP8266_TxBuf[1]='1';
ESP8266_TxBuf[2]=':';
integ = volt/1000000;
ESP8266_TxBuf[3]=integ+'0';
ESP8266_TxBuf[4]='.';
integ=(volt/100000)%10;
ESP8266_TxBuf[5]=integ+'0';
integ=(volt/10000)%10;
ESP8266_TxBuf[6]=integ+'0';
ESP8266_TxBuf[7]='V';
ESP8266_TxBuf[8]=' ';
ESP8266_TxBuf[9]='0';
ESP8266_TxBuf[10]='-';
ESP8266_TxBuf[11]='5';
ESP8266_TxBuf[12]='\r';
}
if(addr==1)
{
ESP8266_TxBuf[14]='2';
ESP8266_TxBuf[15]=':';
integ = volt*2/1000000;
ESP8266_TxBuf[16]=integ+'0';
ESP8266_TxBuf[17]='.';
integ=(volt*2/100000)%10;
ESP8266_TxBuf[18]=integ+'0';
integ=(volt*2/10000)%10;
ESP8266_TxBuf[19]=integ+'0';
ESP8266_TxBuf[20]='V';
ESP8266_TxBuf[21]=' ';
ESP8266_TxBuf[22]='0';
ESP8266_TxBuf[23]='-';
ESP8266_TxBuf[24]='8';
ESP8266_TxBuf[25]='\r';
}
ESP8266_TxBuf[26]='S';
ESP8266_TxBuf[27]='e';
ESP8266_TxBuf[28]='t';
ESP8266_TxBuf[29]=':';
integ=g;
ESP8266_TxBuf[30]=integ+'0';
ESP8266_TxBuf[31]='.';
integ=h;
ESP8266_TxBuf[32]=integ+'0';
ESP8266_TxBuf[33]='V';
ESP8266_TxBuf[34]='\n';
ESP8266_TxBuf[35]='\0';
}
if(ESP8266_RxData[0])
{
ESP8266_RxData[0]=0;
con=30;
}
}
作者:
我只想弄下程序
时间:
2021-9-19 11:26
#include"lcd.h"
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //选择写入命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
// Lcd1602_Delay1ms(1);
LCD1602_DATAPINS = com << 4; //发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择写入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //写入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
#else
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x32); //将8位总线转为4位总线
LcdWriteCom(0x28); //在四位线下的初始化
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
#endif
作者:
我只想弄下程序
时间:
2021-9-19 11:26
#include "esp8266.h"
#include "uart.h"
#include "string.h"
#define ESP8266_BUFF_SIZE 60 //接收缓存
#define ESP8266_RX_MAX 10 //接收数据最大个数
#define RSP8266_TX_MAX 30 //发送数据最大个数
data unsigned char ESP8266_RxBuf[ESP8266_BUFF_SIZE]={0}; //ESP8266接收缓存
unsigned char ESP8266_TxBuf[RSP8266_TX_MAX]={0}; //最大30个字节 可以自己修改大小
unsigned char ESP8266_RxData[ESP8266_RX_MAX]={0}; //接收的处理过的数据
unsigned char ESP8266_InitFlag=0; //ESP8266初始化标志0未完成初始化 1已完成初始化
unsigned char ESP8266_RxLock=0; //接收数据锁
data unsigned char ESP8266_RxCon=0; //ESP8266接收计数
unsigned char LinkID=0; //客户端的连接ID:字符'0','1','2','3','4'最多连接5个
unsigned char SendFlag=0; //发送标志 1发送成功 2发送失败
//需要修改成ESP8266当前接的串口号
void ESP8266_SendChar(unsigned char sbyte)
{
UART1_SendByte(sbyte);
}
//ESP8266数据解锁功能
//定时10-50ms执行
void ESP8266_RxDataUnlock(void)
{
if(ESP8266_RxLock>0)
ESP8266_RxLock++;
}
//ESP8266发送一个字符串函数
void ESP8266_SendStr(unsigned char *str)
{
while(*str != '\0')
{
ESP8266_SendChar(*str);
str++;
}
}
//ESP8266接收数据函数
//将此函数放入串口中断进行接收数据
void ESP8266_ReceiveData(unsigned char rxdata)
{
ESP8266_RxBuf[ESP8266_RxCon++]=rxdata;
if(ESP8266_RxCon>=ESP8266_BUFF_SIZE) //接收数组越限处理
ESP8266_RxCon=0;
ESP8266_RxLock=1;
}
/*
//设置好之后等待客户端的连接,如果有客户端连接成功,则会收到这样的语句
0,CONNECT
前面是LinkID:0-4 //因为ESP8266作为Server最多可以连接5个Client
//客户端主动断开连接
0,CLOSED
//前面是LinkID:0-4
+IPD,0,4:Anfn
+PID表示收到数据,client_id:此数字表示连接的Client编号,len:此数字表示长度,:后边表示收到的数据
*/
//接收的数据分析处理
void ESP8266_ReceiveHandle(void)
{
char *point=NULL;
unsigned char rxlen=0;
unsigned char i=0;
//-------检测是否有客户端连接---------------//
point = strstr((const char *)ESP8266_RxBuf,(const char *)",CONNECT");
if(point!=NULL)//有客户端连接
{
point=point-1;
if(*point>='0' && *point<'5')
LinkID=*point;
}
//-------检测是否有客户端断开-------------//
point = strstr((const char *)ESP8266_RxBuf,(const char *)",CLOSED");
if(point!=NULL)//客户端主动断开连接
{
point=point-1;
if(*point>='0' && *point<'5')
{
if(LinkID==*point) //是当前连接的客户端断开
LinkID=0;
}
}
//-----检测是否有新数据到来-------------//+IPD,0,5:Dfxd0
point = strstr((const char *)ESP8266_RxBuf,(const char *)"+IPD");
if(point!=NULL)//有新数据过来 +IPD,0,4:Anfn
{ // 0
/*--------------更新交互的ID--------------------*/
point=point+5;
if(*point>='0' && *point<'5')
LinkID=*point;
/*--------------计算有效数据长度-------------------*/
point=point+3; //+IPD,0,4:Anfn
if(*point==':') //1位数据
{
rxlen=*(point-1)-0x30;
}
else //两位数据+IPD,0,14:Anfn
{
point=point+1;
if(*point==':')
{
rxlen=10*(*(point-2)-0x30)+(*(point-1)-0x30);
}
}
/*--------------读取接收的数据--------------------*/
if(rxlen>0 && rxlen<ESP8266_RX_MAX)
{
point++;
if(*point=='\n'||*point=='\r') //如果接收到回车或者换行不做处理
return;
for(i=0;i<ESP8266_RX_MAX;i++) //清空数据接收
ESP8266_RxData[i]=0;
for(i=0;i<rxlen;i++) //接收数据
{
ESP8266_RxData[i]=*point;
point++;
}
}
/*-------------------------------------------------*/
}
}
//ESP8266接收缓存清空函数
void ESP8266_BufClr(void)
{
unsigned char i=0;
while(ESP8266_RxLock>0 &&(ESP8266_RxLock<3)); //如果正在接收数据则等待
ESP8266_RxLock=0;
ESP8266_ReceiveHandle(); //清空缓存之前需要先提取一下有用信息
for(i=0;i<ESP8266_BUFF_SIZE;i++)
ESP8266_RxBuf[i]=0;
ESP8266_RxCon=0;
}
//作为Server模式进行初始化步骤如下
//注意使用AT指令后边需要加\r\n 载入发送数据的时候不用
//1:AT 握手测试
//2:ATE0 关闭回显
//3:AT+CWMODE=2 设置成AP模式
//5:AT+RST //一定要重启生效
//4:AT+CIPMUX=1 多连接
//5:AT+CIPAP="192.168.4.1"设置IP地址
//6:AT+CIPSERVER=1,9000设置端口号
//ESP8266任务函数
void ESP8266_Task(void)
{
unsigned char i=0;
static unsigned char len=0;
static unsigned char step=0; //初始化步骤
static unsigned int time=0; //间隔时间
char *point=NULL;
if(ESP8266_InitFlag==1) //0的时候没有进行初始化
{
time++;
if(LinkID>0) //有客户端连接了
{
switch(step) //0等待数据装入发送缓存
{
case 0: //检测有没有数据需要发送
{
/*----------------------------------------*/
if(time>=2)
{
time=0;
ESP8266_BufClr(); //检测接收的数据
}
if(ESP8266_TxBuf[0]!=0) //发送缓存有数据载入 进行自动发送
{
//1:发送之前需要计算要发送数据的长度
for(len=0;len<RSP8266_TX_MAX;len++)
{
if(ESP8266_TxBuf[len]==0)//1230
break;
}
//2:请求发送数据+长度
ESP8266_SendStr((unsigned char *)"AT+CIPSEND=");
ESP8266_SendChar(LinkID);
ESP8266_SendChar(',');
if(len>9)
ESP8266_SendChar(len/10+0x30);
ESP8266_SendChar(len%10+0x30);
ESP8266_SendStr((unsigned char *)"\r\n");
step=1;
}
}break;
/*----------------------------------------*/
case 1: //准备发送数据
{
if(time>=2)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)">"); //接收到>表示可以发送数据
if(point!=NULL)//收到>表示可以发送数据
{
ESP8266_BufClr();
for(i=0;i<len;i++)
ESP8266_SendChar(ESP8266_TxBuf[i]); //载入需要发送的数据
for(i=0;i<RSP8266_TX_MAX;i++) //清空发送缓存
ESP8266_TxBuf[i]=0;
step=2;
}
else //没有收到> 则进行LinkID检测
{
point = strstr((const char *)ESP8266_RxBuf,(const char *)"link is not valid"); //连接不可用
if(point!=NULL)
{
LinkID=0;
SendFlag=2; //发送失败
}
step=0;
ESP8266_BufClr();
}
}
}break;
/*----------------------------------------*/
case 2: //发送数据反馈检测
{
if(time>=2)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"link is not valid");//连接不可用
if(point!=NULL)
{
LinkID=0;
SendFlag=2; //发送失败
}
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");//连接不可用
if(point!=NULL)
{
SendFlag=1; //发送成功
}
ESP8266_BufClr();
step=0;
}
}break;
/*----------------------------------------*/
default: step=0; break;
}//end of switch
}
else //没有客户端连接
{
if(time>2)
{
time=0;
step=0;
ESP8266_BufClr();
}
}
}
else //初始化没有完成进行初始化操作
{
time++;
switch(step)
{
/*--------------------step0发送握手指令AT----------------------------------*/
case 0:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT\r\n");
step=1;
time=0;
}break;
case 1:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=2;
else
step=0;
}
}break;
/*--------------------step1关闭回显----------------------------------*/
case 2:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"ATE0\r\n");
step=3;
time=0;
}break;
case 3:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=4;
else
step=0;
}
}break;
/*--------------------step2设置成AP模式----------------------------------*/
case 4:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+CWMODE=2\r\n");
step=5;
time=0;
}break;
case 5:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=6;
else
step=0;
}
}break;
/*--------------------重启生效---------------------------------*/
case 6:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+RST\r\n");
step=7;
time=0;
}break;
case 7:
{
if(time>15)
{
time=0;
step=8;
}
}break;
/*--------------------step3设置多连接AT+CIPMUX=1---------------------------------*/
case 8:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+CIPMUX=1\r\n");
step=9;
time=0;
}break;
case 9:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=10;
else
step=0;
}
}break;
/*--------------------step4设置IP地址AT+CIPAP=\"192.168.4.1\"----------------------*/
case 10:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+CIPAP=\"192.168.4.1\"\r\n");
step=11;
time=0;
}break;
case 11:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=12;
else
step=0;
}
}break;
/*--------------------step5设置Port:AT+CIPSERVER=1,9000----------------------*/
case 12:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+CIPSERVER=1,9000\r\n");
step=13;
time=0;
}break;
case 13:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
ESP8266_InitFlag=1; //初始化成功
else
ESP8266_InitFlag=0; //初始化失败
step=0;
}
}break;
default: step=0; ESP8266_InitFlag=0; break;
}
}
}
作者:
我只想弄下程序
时间:
2021-9-19 11:28
电路就esp8266直接连RXD和TXD
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1