• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Отправка с ESP8266 на ПК

Daemon2017

New member
Добрый день!

Имеется вот такой код:
Код:
#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 должна слать строки до тех пор, пока ее буфер не опустошится.

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

CodeNameHawk

Moderator
Команда форума
Но, по моему плану (см. функцию GetFromStmSendToPc()), ESP должна слать строки до тех пор, пока ее буфер не опустошится.
Похоже тут у вас не правильная логика, в буфере у вас может быть не полная строка(например может быть всего один байт), а вы пытаетесь
читать байты до байта конца строки '\n' не проверяя количества доступных байтов в буфере есп.
Код:
while (Serial.available())
{
    Serial.readBytesUntil('\n', BufFromSTM, BufSize);
 
Последнее редактирование:

Evgeniy163

New member
@Daemon2017, после выполнения UDP.endPacket() UDP.remoteIP сбрасывается в "0.0.0.0" поэтому посылает только один раз после приема пакета. Нужно сохранять remoteIP в переменную (на пример в IPAddress pcIP).
Ну и чтение порта надо изменить.
Код:
   size_t s = Serial.readBytesUntil('\n', BufFromSTM, BufSize);
    //Serial1.println(BufFromSTM);
    UDP.beginPacket(pcIP, localPort);
    UDP.write(BufFromSTM, s);
    UDP.endPacket();
 

Oleeeg

New member
Ребзя, чтобы новую тему не создавать и не флудить, помогите плиз, подскажите, с помощью какой фунции реализовать, чтобы данные с датчиков на хтмл странице не обновлялись, а каждое новое значение добавлялось новой строкой на странице хтмл...
 
Сверху Снизу