ESP32学习:程序自动跳出while循环问题(已解决)

已解决:
勾选 保持TCP长连接 选项即可
在这里插入图片描述

在学习TCP client相关时,遇到的上述问题

贴上代码

#include <WiFi.h>

const char *ssid = "wifi;
const char *password = "密码";

const IPAddress serverIP(192,168,1,5); //目标地址
uint16_t serverPort = 8106;         //目标服务器端口号

WiFiClient client;   //声明一个客户端对象,用于与服务器进行连接

void setup()
{
    Serial.begin(115200);
    Serial.println();

    WiFi.mode(WIFI_STA);   //站点模式
    WiFi.setSleep(false);  //关闭STA模式下wifi休眠,提高响应速度
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(2500);
        Serial.print(".");
    }
    Serial.println("已连接");
    Serial.print("本机ip地址:");
    Serial.println(WiFi.localIP());



    Serial.println("尝试访问服务器");
    if (client.connect(serverIP, serverPort)) //尝试访问目标地址
    {
        Serial.println("访问成功");

        client.print("Hello world!");                    //向服务器发送数据
        while (client.connected()) //如果已连接或有收到的未读取的数据
        {
        Serial.println("已连接"); 
          if(client.available())
          {
              Serial.println("查询信息:");
              if (client.available()) //如果有数据可读取
              {
                  String line = client.readStringUntil('\n'); //读取数据到换行符
                  Serial.print("收到消息:");
                  Serial.println(line);
                  client.write(line.c_str()); //将收到的数据回发      
                  //c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同  
              }
          }
        }
        Serial.println("关闭当前连接");
        client.stop(); //关闭客户端
    }
    else
    {
        Serial.println("访问失败");
        client.stop(); //关闭客户端
    }
}

void loop()
{
}

运行结果:
在这里插入图片描述

        Serial.println("已连接"); 

这句代码,是我用来调试查看程序运行情况的

可以看到,本应该一直挂机等待消息的程序在循环18次之后,自动跳出while()循环了

该问题留待解决…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是基于STM32和ESP8266的自动获取IP地址的示例代码: ```c #include <stdio.h> #include <string.h> #include "stm32f4xx.h" #define ESP8266_USART USART6 void ESP8266_Init(void) { // 初始化ESP8266串口 USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(ESP8266_USART, &USART_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(ESP8266_USART, USART_IT_RXNE, ENABLE); USART_Cmd(ESP8266_USART, ENABLE); } void ESP8266_SendCommand(char* command) { while(*command != 0) { USART_SendData(ESP8266_USART, *command++); while(USART_GetFlagStatus(ESP8266_USART, USART_FLAG_TXE) == RESET); } } void ESP8266_GetIP(void) { char buffer[100]; int i = 0; ESP8266_SendCommand("AT+CIFSR\r\n"); while(1) { while(USART_GetFlagStatus(ESP8266_USART, USART_FLAG_RXNE) == RESET); char c = USART_ReceiveData(ESP8266_USART); buffer[i++] = c; if(strstr(buffer, "192.168.1.") != NULL) { printf("IP address: %s\r\n", strstr(buffer, "192.168.1.")); break; } } } int main(void) { ESP8266_Init(); ESP8266_GetIP(); while(1); } ``` 在这个示例中,我们首先初始化ESP8266的串口,并设置为接收和发送模式。然后,我们发送AT+CIFSR命令来获取ESP8266的IP地址。在接收到ESP8266的响应后,我们检查响应是否包含“192.168.1.”字符串,如果包含,则打印IP地址并退出循环。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值