Arduino 执行其他操作时,ESP8266 UDP ParsePackage不工作

Arduino 执行其他操作时,ESP8266 UDP ParsePackage不工作,arduino,udp,wifi,esp8266,Arduino,Udp,Wifi,Esp8266,在过去的几天里,测试我情绪的问题是,尽管我的ESP8266芯片完全能够在while循环中通过parsePacket获取数据包,但当我既想监听传入的数据包,又想让我的ESP8266读取传感器并通过wifi发送这些数据包时,它完全忽略了这些数据包 因此,我删掉了所有与传感器有关的内容,并在下面粘贴了代码,但下面是正在发生的事情 在Setup()中,ESP设置wifi、SoftAP节点和UDP并对其进行配置 然后,它进入while循环,通过wifi监听传入的包;这会告诉ESP开始吐出数据 当ESP接收

在过去的几天里,测试我情绪的问题是,尽管我的ESP8266芯片完全能够在while循环中通过parsePacket获取数据包,但当我既想监听传入的数据包,又想让我的ESP8266读取传感器并通过wifi发送这些数据包时,它完全忽略了这些数据包

因此,我删掉了所有与传感器有关的内容,并在下面粘贴了代码,但下面是正在发生的事情

  • 在Setup()中,ESP设置wifi、SoftAP节点和UDP并对其进行配置
  • 然后,它进入while循环,通过wifi监听传入的包;这会告诉ESP开始吐出数据
  • 当ESP接收到数据包(这是“a.时,“通用类”中的WiFi事件用于传输层以下的OSI级别。TCP和UDP是传输层

    要接收UDP数据包,必须在
    loop()
    (或在从
    loop()
    调用的函数中)调用
    UDP.parsePacket();
    ,就像其他实现Arduino
    UDP
    基类的Arduino网络库一样


    如果数据包可用,则调用
    parsePacket
    将数据包读入内部缓冲区并返回数据包的大小。下一次调用
    parsePacket
    将清除缓冲区并用新数据包(如果可用)填充。您调用
    parsePacket
    两次,第二次总是不返回任何内容。

    感谢您的回复。如何我不确定我是否理解正确。如果你查看我发布的代码,在
    void loop()中有一个
    int packetSize=UDP.parsePacket();
    call。您能详细说明一下,为了实现您的解决方案,您将在代码中更改哪些内容吗?它不起作用,因为您已经解析了两次数据包。第二次解析丢弃了第一次
    #include <Wire.h>
    #include <ESP8266WiFi.h>
    #include <WiFiUDP.h>
    
    String SendString;
    String SendBuffer = "STR ";
    boolean SendSuccessful;
    char SendChar[32];
    
    // wifi connection variables
    const char* password = #########;
    boolean wifiConnected = false;
    String ssid_string;
    char ssid[10];
    
    // UDP variables
    unsigned int localPort = 8888;
    WiFiUDP UDP;
    boolean udpConnected = false;
    char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
    char ReplyBuffer[500] = "acknowledged"; // a string to send back
    
    void setup(void) {
      Serial.begin(115200);
    
      //Setup all my sensors, code not relevant
    
      //Connect Wifi
      ssid_string = "DRILL_" + String(chip_id);
      ssid_string.toCharArray(ssid, 500);
      SetupWifi(ssid);
    }
    
    void loop(void) {
    
      //B. <<<< SO THIS IS THE PART IN THE LOOP THAT IS NOT WORKING
      int packetSize = UDP.parsePacket();
      packetSize = UDP.parsePacket();  
      if (packetSize) {
        Serial.println("");
        Serial.print("Received packet");
    
        // read the packet into packetBufffer
        UDP.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
        Serial.println("Contents:");
        int value = packetBuffer[0] * 256 + packetBuffer[1];
        Serial.println(value);
      }
    
      //Read out all my sensors, code not relevant, paste all sensor data in one string
    
      //SendString over serial
      Serial.print(SendString);
    
      SendIntervalUDP(1); // Send SendString over UDP every x measurements (see function below)
    
      //Listen to serial
      if (Serial.available() > 0) {
        String Received = Serial.readString();
        Serial.println("ESP received: " + Received);
      }
    }
    
    unsigned long previousWifiStatMillis;
    
    //Connect wifi during setup
    void SetupWifi(char my_ssid[]) {
    
      // WiFi init
      wifiConnected = createAP(my_ssid);
    
      udpConnected = connectUDP();
    
      // Wait for first packet
      Serial.println("Waiting for start");
    
      //A. <<<< SO THIS IS THE PART IN THE CODE THAT IS ACTUALLY WORKING
      int packetSize = UDP.parsePacket();
      while (packetSize < 1) {
        packetSize = UDP.parsePacket();
        yield(); // Allow the background functions to work
        //Listen to serial
        if (Serial.available() > 0) {
          String Received = Serial.readString();
          Serial.println("I received: " + Received);
          if (Received.substring(0) == "S") {
            Serial.println("Starting..");
            break;
          }
        }
    
        if (packetSize)
        {
          Serial.println("");
          Serial.print("Received packet");
    
          // read the packet into packetBufffer
          UDP.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
          Serial.println("Contents:");
          int value = packetBuffer[0] * 256 + packetBuffer[1];
          Serial.println(value);
    
        }
      }
    }
    
    
    // connect to UDP – returns true if successful or false if not
    boolean connectUDP() {
      boolean state = false;
    
      Serial.println("");
      Serial.println("Connecting to UDP");
    
      if (UDP.begin(localPort) == 1) {
        Serial.println("Connection successful");
        state = true;
      }
      else {
        Serial.println("Connection failed");
      }
    
      return state;
    }
    
    // connect to wifi – returns true if successful or false if not
    boolean createAP(char my_ssid[]) {
      boolean state = true;
      int i = 0;
      WiFi.softAP(my_ssid, password);             // Start the access point
      WiFi.mode(WIFI_AP);
      Serial.print("Access Point \"");
      Serial.print(my_ssid);
      Serial.println("\" started");
      Serial.print("IP address:\t");
      Serial.println(WiFi.softAPIP());         // Send the IP address of the ESP8266 to the computer
      state = true;
      return state;
    }
    
    
    // connect to wifi – returns true if successful or false if not
    boolean connectWifi(char my_ssid[]) {
      boolean state = true;
      int i = 0;
      WiFi.begin(my_ssid, password);
      Serial.println("");
      Serial.println("Connecting to WiFi");
    
      // Wait for connection
      Serial.print("Connecting");
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
        if (i > 20) {
          state = false;
          break;
        }
        i++;
      }
      if (state) {
        Serial.println("");
        Serial.print("Connected to ");
        Serial.println(my_ssid);
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
      }
      else {
        Serial.println("");
        Serial.println("Connection failed.");
      }
      return state;
    }
    
    void SendIntervalUDP(int interval) {
      //Send an udp packet every x packets with x the interval
      j++;
      if (j > (interval-1) ) {
        j = 0;
        //SendString over wifi
        if (wifiConnected) {
          if (udpConnected) {
            // send a reply, to predetermined hotspot
            UDP.beginPacket(UDP.remoteIP(), UDP.remotePort());
            SendBuffer.toCharArray(ReplyBuffer, 500);
            UDP.write(ReplyBuffer);
            UDP.endPacket();
          }
        }
        SendBuffer = "";
      }
    }