标题: ESP8266程序只能通过发送AT,后续指令会卡住 [打印本页]

作者: fairykid    时间: 2023-6-6 14:01
标题: ESP8266程序只能通过发送AT,后续指令会卡住
运行到红线再向下就不动了,之前为了检查是哪一条开始卡住,在每条指令间插入了小灯亮灭,也就是观察到了亮、灭
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED = P1^3;u8 dat;
sbit LED1 = P1^2;
void Init(void);//串口初始化函数
void Delay_ms(u16 n);//延时子函数
void Sent_ZF(u8 dat);//发送一个字节
void AT_Send_String(u8 *string);//发送字符串
void ESP8266_Init();//ESP8266初始化
void Init(void)                //串口初始化函数
{
        TMOD = 0x20;        //定时器工作方式2,8位自动重载(0010 0000)
        TL1 = 0xfd;                //装入初值
        TH1 = 0xfd;               
        TR1 = 1;        //启动定时器1
        REN=1;    //允许串行口接收数据
        SM0=0;    //工作方式1,10位异步收发
        SM1=1;   
        EA = 1;   //打开全局中断控制
        ES=1;     //打开串行口中断
}

void main()
{
    Init();
    ESP8266_Init();
    while(1);
}

void Sent_ZF(u8 dat)  //发送一个字节
{
        ES = 0;
        TI=0;
        SBUF = dat;
        while(!TI);
        TI = 0;
        ES = 1;
}
void Delay_ms(u16 n)
{
        unsigned int i,j;
        for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}

void AT_Send_String(u8 *string)  //发送字符串
{
  while(*string)
  {
    Sent_ZF(*string++);
                Delay_ms(5);
  }

}
void ESP8266_Init()   //esp82663?ê??ˉ
{        LED1=1;
  Delay_ms(1000);
        Delay_ms(1000);
        AT_Send_String("AT\r\n"); //测试AT指令
        Delay_ms(1000);
        Delay_ms(1000);
  LED1=0;
        AT_Send_String("AT+CWSAP=xhwang2019,12345678\r\n"); //  
        Delay_ms(1000);
        Delay_ms(1000);
        LED1=1;


}
void InterruptUART() interrupt 4   
{
        RI = 0;        //清零
        dat = SBUF;    //收到的数据占存到SBUF中
          {
         if(dat=='o')
                                 {
                                         LED =0;   
                                 }
                                 if(dat=='f')  
                                 {                                                 
                                    LED =1;
                                 }                                         
          }
}


Snipaste_2023-06-06_13-59-25.jpg (20.37 KB, 下载次数: 35)

Snipaste_2023-06-06_13-59-25.jpg

作者: munuc_w    时间: 2023-6-6 14:27
ESP8266进入AT模式后只接收AT格式的指令。
作者: yzwzfyz    时间: 2023-6-6 15:25
看看通讯协议手册上怎么说。
作者: fairykid    时间: 2023-6-6 16:21
munuc_w 发表于 2023-6-6 14:27
ESP8266进入AT模式后只接收AT格式的指令。

程序中确实是发送的at指令字符串,并且找了很多例程也没用
作者: cnos    时间: 2023-6-6 18:52
目测串口初始化的问题,直接用STC的ISP软件生成一个串口初始化程序试试
应该是Send_ZF函数卡住了
作者: 597329015    时间: 2023-6-6 22:09
根据您提供的代码,我注意到您的主程序中只初始化了串口和 ESP8266 模块,并在循环中实现了空操作。而在串口中断处理函数中,根据输入的字符 'o' 和 'f' 分别控制了 LED 灯的亮灭。

由于没有详细的说明和注释,我无法判断代码在运行时是否存在问题,调试代码建议您使用单步跟踪和调试工具来分析问题的根本原因。

另外需要注意的是,在 ESP8266 模块初始化代码中,您发送了 AT 指令和设置了 ESP8266 的无线热点名称和密码。如果想要正常连接无线网络,还需要进一步配置相应的参数,例如 IP 地址、网关、子网掩码等。
作者: 123156fsadf    时间: 2023-6-7 08:46
597329015 发表于 2023-6-6 22:09
根据您提供的代码,我注意到您的主程序中只初始化了串口和 ESP8266 模块,并在循环中实现了空操作。而在串 ...

8266只需要发送无线名和密码就可以了,其他的路由器自动分配的。不过他的void AT_Send_String(u8 *string)  //发送字符串
{
  while(*string)
  {
    Sent_ZF(*string++);
                Delay_ms(5);
  }

}函数,发一个字节就延时5ms,会导致8266将一字节当作一帧数据,从而导致无法正确处理AT指令吧。
还有就是8266要配置成单连接模式,client模式等,AT指令好像有所缺失
作者: 123156fsadf    时间: 2023-6-7 08:48
597329015 发表于 2023-6-6 22:09
根据您提供的代码,我注意到您的主程序中只初始化了串口和 ESP8266 模块,并在循环中实现了空操作。而在串 ...

我又看了一下,他应该是要配成ap模式,那就缺了这条AT指令,以及缺失TCP侦听端口信息。
作者: 51hei**1140    时间: 2023-6-7 13:20
建议你采用透传模式下的ESP8266,避免繁琐的AT指令设置,透传方式更稳定切方便快捷




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1