Отправка с ESP8266 на ПК

Тема в разделе "Проводная и беспроводная связь", создана пользователем Daemon2017, 28 мар 2017.

  1. Daemon2017

    Daemon2017 Нерд

    Добрый день!

    Имеется вот такой код:
    Код (C++):
    #include <ESP8266WiFi.h>
    #include <WiFiUDP.h>
    #include <stdio.h>

    WiFiUDP UDP;

    const char* ssid = "DESKTOP-P0OPNR2 4337";
    const char* password = "12345678";
    boolean wifiConnected = false;

    unsigned int localPort = 8888;
    boolean udpConnected = false;
    char packetBuffer[UDP_TX_PACKET_MAX_SIZE];

    const int BufSize = 128;

    String inputSTM_UART;
    char BufFromSTM[BufSize];
    char BufFromPC[BufSize];

    void setup()
    {
      Serial.begin(9600);
      Serial1.begin(9600);

      pinMode(D0, OUTPUT);

      wifiConnected = connectWifi();

      if (wifiConnected)
      {
        udpConnected = connectUDP();
      }
    }

    void loop()
    {
      if (wifiConnected)
      {
        if (udpConnected)
        {
          int packetSize = UDP.parsePacket();

          if (packetSize)
          {
            GetFromPcSendToStm();
          }

          GetFromStmSendToPc();

          delay(20);
        }
      }
    }

    void GetFromPcSendToStm()
    {
      UDP.read(BufFromPC, UDP_TX_PACKET_MAX_SIZE);

      Serial.println(BufFromPC);

      delay(20);
    }

    void GetFromStmSendToPc()
    {
      digitalWrite(D0, HIGH);

      while (Serial.available())
      {
        //Serial.readString().toCharArray(BufFromSTM, BufSize);
        //Serial.readBytes(BufFromSTM, BufSize);
        Serial.readBytesUntil('\n', BufFromSTM, BufSize);

        //Serial1.println(BufFromSTM);

        UDP.beginPacket(UDP.remoteIP(), UDP.remotePort());
        UDP.write(BufFromSTM);
        UDP.endPacket();

        delay(20);
      }

      digitalWrite(D0, LOW);
    }

    boolean connectUDP()
    {
      boolean state = false;

      if (UDP.begin(localPort) == 1)
      {
        state = true;
      }

      return state;
    }

    boolean connectWifi()
    {
      boolean state = true;
      int i = 0;

      WiFi.begin(ssid, password);

      while (WiFi.status() != WL_CONNECTED)
      {
        delay(500);

        if (i > 10)
        {
          state = false;
          break;
        }

        i++;
      }

      return state;
    }
    Принцип такой: с ПК я отправляю на ESP команды движения (см. функцию GetFromPcSendToStm) и переотправляю их на STM32 - эта часть работает безупречно. Затем, STM32 катит, опрашивает датчики и отправляет данные на ESP (см. функцию GetFromStmSendToPc), а та должна переслать данные на ПК.

    И вот тут начинается беда: по WiFi ПК не получает вообще ничего!
    Я начал грешить на отсылку STMкой или на прием ESPшкой. Как известно, у ESP есть еще один UART, который не умеет принимать, но умеет передавать. Я задействовал его и слал по нему те же данные, что и по WiFi - все приходило, жалоб нет. Т.е. косяк именно в передаче ESPшкой по WiFi.

    Попробовал переписать одну из функций, переставив одну строку:
    Код (C++):
    void loop()
    {
      if (wifiConnected)
      {
        if (udpConnected)
        {
          int packetSize = UDP.parsePacket();

          if (packetSize)
          {
            GetFromPcSendToStm();

            GetFromStmSendToPc();
          }

          delay(20);
        }
      }
    }
    Теперь ПК принимает данные от ESP, но только 1 штуку на каждую отправленную ПК команду.
    Т.е. если я с ПК отправлю 3 раза команду ехать вперед, то получу 3 строки с данными датчиков!

    Но, по моему плану (см. функцию GetFromStmSendToPc()), ESP должна слать строки до тех пор, пока ее буфер не опустошится.

    Пожалуйста, подскажите, что я делаю не так?
     
  2. ИгорьК

    ИгорьК Гуру

    Вы работаете с Икрой JS - JavaScript?
    Программируете ESP-8266 на Lua. Это такой же JS только проще.
     
  3. rkit

    rkit Гуру

    Чет у вас какой-то странный код. Зачем вы нагородили всё это добро с if (wifiConnected) итд? Почему у вас делеи везде натыканы ненужные?

    Почему бы не прописать хардкодом всё это дело?

    Почему не проверяете, что оно вам там вернуло?

    Почему вы вообще используете UDP, а не TCP?