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

Daemon2017
Offline
Зарегистрирован: 08.10.2013

Добрый день!



Имеется вот такой код:

#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.



Попробовал переписать одну из функций, переставив одну строку:

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

      if (packetSize)
      {
        GetFromPcSendToStm();

        GetFromStmSendToPc();
      }

      delay(20);
    }
  }
}

Теперь ПК принимает данные от ESP, но только 1 штуку на каждую отправленную ПК команду. 

Т.е. если я с ПК отправлю 3 раза команду ехать вперед, то получу 3 строки с данными датчиков!



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



Пожалуйста, подскажите, что я делаю не так?

evgeniy063
Offline
Зарегистрирован: 08.03.2017

Нужна глобальная переменная: IPAddress pcIP;
При приеме первого пакета в ней сохраните UDP.remoteIP().

pcIP = UDP.remoteIP();

строку 77 переписать:

UDP.beginPacket(pcIP, localPort);

Должно работать, пробуйте.
Ну и еще коечто изменить.

size_t s = Serial.readBytesUntil('\n', BufFromSTM, BufSize);

UDP.write(BufFromSTM, s);