找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1496|回复: 6
打印 上一主题 下一主题
收起左侧

为什么esp8266连上去了我用按键控制的值就会乱,esp8266都没接电源呀

[复制链接]
跳转到指定楼层
楼主
ID:965637 发表于 2021-9-12 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2021-9-12 16:48 | 只看该作者
如果,程序中有读其它设备值得指令, 当目标设备没有通电时,大概率读到值会是任意值,这是数电的正常现象,所以才会通过 上拉,或下拉 电阻,来避免这种情况。
回复

使用道具 举报

板凳
ID:277550 发表于 2021-9-13 08:35 | 只看该作者
电路连接、程序,是如何的
回复

使用道具 举报

地板
ID:965637 发表于 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;
        }

}
回复

使用道具 举报

5#
ID:965637 发表于 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
回复

使用道具 举报

6#
ID:965637 发表于 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;       
                }                                        

        }

}














回复

使用道具 举报

7#
ID:965637 发表于 2021-9-19 11:28 | 只看该作者
电路就esp8266直接连RXD和TXD
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表