乐鑫技术交流
直播中

李莉

7年用户 1375经验值
私信 关注
[问答]

ESP-01建立一个TCP服务器,但模块在几秒钟后自动重置的原因?

我正在尝试建立一个TCP服务器,但模块在几秒钟后自动重置。
我在 UART 中获取这些日志。
ets 2013-01-8,第一个原因:4,开机模式:(3,6)

WDT 复位
负载0x3ffe8000,LEN 876,16 室
尾 12
Chksum 0x07
Ho 0 尾 12 房间 4
负载0x3ffe8370,LEN 624,12 室
尾巴 4
Chksum 0x87
负载0x40100000,LEN 28528,4 室
尾 12
Chksum 0x84
CSUM 0x84



这是我的代码:

法典:全选
#include
#include
#include
#include
#include
#include
#include
#include

LOCAL struct espconn esp_conn;
本地esp_tcp esptcp;

/*静态os_timer_t s_Timer;
int s_Tick = 0;

void TimerFunction(void *arg)
{
   
   s_Tick++;
   
   if(GPIO_REG_READ(GPIO_OUT_ADDRESS) & BIT2)
   {
      gpio_output_set(0, BIT2, BIT2, 0);
   }
   else
   {
      gpio_output_set(BIT2, 0, BIT2, 0);
   }
   os_timer_disarm(&s_Timer);
}

void 眨眼(int x)
{
   int i;
   for (i = 0; i < (x * 2); i++)
   {
      os_timer_setfn(&s_Timer, TimerFunction, NULL);
      os_timer_arm(&s_Timer, 300, 0);
   }
}*/

LOCAL void ICACHE_FLASH_ATTR tcp_server_sent_cb(void *arg)
{
   os_printf("nSent Successfuly");   
}



LOCAL void ICACHE_FLASH_ATTR tcp_server_recv_cb(void *arg, char *pusrdata, unsigned short length)
{
   os_printf("nRecieved Data : %s", pusrdata);
   char *data = "ON";
   int x = os_strncmp(pusrdata, data, os_strlen(data));
   os_printf("nX : %d", x);
   if (x == 0)
      os_printf("nDevice is ON");
   else
   {
      os_printf("nWrong Data Recieved!!!!");
      //blink(1);
   }
   
}


LOCAL void ICACHE_FLASH_ATTR tcp_server_discon_cb(void *arg)
{
   os_printf("nServer Disconnected");
}


LOCAL void ICACHE_FLASH_ATTR tcp_server_recon_cb(void *arg, sint8 错误)
{
   os_printf("nServer Connection Failed!! Re-connecting");
}


LOCAL void ICACHE_FLASH_ATTR tcp_server_connect(void *arg)
{
   os_printf("nA Device Connected to Server");
   //blink(1);
   struct espconn *pesp_conn = arg;

   espconn_regist_recvcb(pesp_conn, tcp_server_recv_cb);
   espconn_regist_reconcb(pesp_conn, tcp_server_recon_cb);
   espconn_regist_disconcb(pesp_conn, tcp_server_discon_cb);
   espconn_regist_sentcb(pesp_conn, tcp_server_sent_cb);
}

无效 ICACHE_FLASH_ATTR user_tcpserver_init()
{
   const char tcp_local_ip[4] = { 192, 168, 123, 101 };
   esp_conn.type = ESPCONN_TCP;
   esp_conn.state = ESPCONN_NONE;
   esp_conn.proto.tcp = &esptcp;
   esp_conn.proto.tcp->local_port = 8881;
   os_memcpy(esp_conn.proto.tcp->local_ip, tcp_local_ip, 4);
   espconn_regist_connectcb(&esp_conn, tcp_server_connect);
   espconn_accept(&esp_conn);
   os_printf("nTCP Server Established");
}

void ICACHE_FLASH_ATTR user_set_softap_config(void)
{
   struct softap_config config;

   wifi_softap_get_config(&config);
   
   os_memset(config.ssid, 0, 32);
   os_memset(config.password, 0, 64);
   os_memcpy(config.ssid, "ESP8266", 7);
   os_memcpy(config.password, "12345678", 8);
   config.authmode = AUTH_WPA_WPA2_PSK;
   config.ssid_len = 7;
   config.beacon_interval = 100;
   config.max_connection = 4;

   wifi_softap_set_config(&config);
   os_printf("nSoftAP Configured");
   
}


void user_init(void)
{  
   //system_soft_wdt_stop();
   os_printf("nSystem Startedn");
   gpio_init();
   PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
   gpio_output_set(BIT2, 0, BIT2, 0);
   //blink(1);
   if(wifi_get_opmode() != SOFTAP_MODE)
   {
      wifi_set_opmode(SOFTAP_MODE);
      system_restart();
   }
   os_printf("nWifi OPMODE : SOFTAP");
   user_set_softap_config();
   user_tcpserver_init();
}


请帮帮我。

谢谢


回帖(1)

贾小龙

2024-7-10 17:49:23
从您提供的信息来看,ESP-01模块在几秒钟后自动重置的原因可能是由于看门狗定时器(Watchdog Timer,简称WDT)触发导致的。看门狗定时器是一种在微控制器中用于防止程序卡死或停止响应的机制。当程序运行时间过长,没有及时“喂狗”(即重置看门狗定时器)时,看门狗定时器会触发系统重置。

在您的日志中,可以看到以下信息:

```
WDT 复位负载0x3ffe8000
```

这表明看门狗定时器已经触发了重置。

要解决这个问题,您可以尝试以下方法:

1. 在程序中添加看门狗定时器的初始化代码。在您的程序开始时,调用以下函数来初始化看门狗定时器:

```c
void system_init(void)
{
    system_update_cpu_freq(SYS_CPU_80MHZ);
    system_init_watchdog();
}
```

2. 在程序的适当位置添加看门狗定时器的重置代码。您可以使用以下函数来重置看门狗定时器:

```c
void ICACHE_FLASH_ATTR
system_soft_wdt_reset(void)
{
    WDT_RESET();
}
```

确保在程序的循环或关键部分调用`system_soft_wdt_reset()`函数,以防止看门狗定时器触发重置。

3. 检查您的代码是否存在死循环或阻塞操作,这可能导致程序无法及时重置看门狗定时器。确保程序在执行关键任务时,定期调用`system_soft_wdt_reset()`函数。

4. 如果问题仍然存在,您可以尝试修改看门狗定时器的超时时间。在`system_init_watchdog()`函数中,可以设置不同的超时时间。例如:

```c
void system_init_watchdog(uint8_t timeout_s)
{
    system_soft_wdt_feed();
    REG_SET_BIT(0x3ff00014, BIT(0));
    REG_CLR_BIT(0x3ff00014, BIT(0));
    REG_WRITE(0x3ff00018, (timeout_s * 80) & 0xffffff);
}
```

将`timeout_s`设置为一个较大的值,以增加看门狗定时器的超时时间。

希望这些建议能帮助您解决问题。如果问题仍然存在,请检查您的代码和硬件连接,确保没有其他问题导致模块重置。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分