ESP8266 UDP parsePacket не работает при выполнении других вещей - PullRequest
0 голосов
/ 21 ноября 2018

Проблема тестирования моего настроения в течение последних нескольких дней состоит в том, что, хотя мой чип ESP8266 вполне способен извлекать пакеты с parsePacket в цикле while, он полностью пропускает их, когда я хочу ОБА прослушивать входящие пакеты, но также и разрешать мойESP8266 для считывания датчиков и отправки их по Wi-Fi.

Итак, я вырезал все, что связано с датчиками, и вставил приведенный ниже код, но вот что происходит.

  1. В Setup () ESP устанавливает wifi, узел SoftAP, UDP и настраивает его.
  2. Затем он попадает в цикл while, где он прослушивает входящий пакет по Wi-Fi;это говорит ESP начать выплевывать данные.
  3. Когда ESP получает пакет (это комментарий "A. <<<" в моем коде и работает нормально), код перемещается в часть Loop (), и датчики начинают выплевывать данные, которыеотправить по Wi-Fi </li>

МОЯ ПРОБЛЕМА ЭТОТ ШАГ:

Во время считывания датчиков и отправки данных по Wi-Fi, я хочу, чтобы ESP8266 также мог принимать входящие пакеты по Wi-Fi (это комментарий "B. <<<" в моем коде и не работает), ESPпродолжает посылать данные датчика по Wi-Fi, но он не получает пакетов </li>

Я предполагаю, что A. работает нормально, поскольку условие while позволяет parsePacket всегда перехватывать входящий пакет.И поскольку B. находится внутри цикла void, я не могу использовать условие while, а вместо него выражение if, команда parsePacket не запрашивает входящий пакет в нужный момент.Я не смог реализовать то, что решает это.Немало поисков на самом деле не помогает, и я не могу представить, что у меня одна такая проблема.

Некоторые вещи, которые я нашел, связанные:

Я очень ценю вашу помощь и обратную связь!

Вот мой код:

#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);
  }
}

Теперь это некоторые из функций поддержки при настройке Wi-Fi и отправке данных по Wi-Fi

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 = "";
  }
}

1 Ответ

0 голосов
/ 21 ноября 2018

События WiFi в «Универсальном классе» предназначены для уровней OSI ниже транспортного уровня.TCP и UDP являются транспортным уровнем.

Для получения пакетов UDP вы должны вызвать UDP.parsePacket(); в lopp () (или в функции, вызываемой из loop ()), как и в любой другой сетевой библиотеке Arduino, реализующей Arduino UDPбазовый класс.

Если пакет доступен, вызов parsePacket считывает пакет во внутренний буфер и возвращает размер пакета.Следующий вызов parsePacket очищает буфер и заполняет его новым пакетом, если он доступен.Вы вызываете parsePacket дважды, а второй всегда ничего не возвращает.

...