• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
Ребзя, чтобы новую тему не создавать и не флудить, помогите плиз, подскажите, с помощью какой фунции реализовать, чтобы данные с датчиков на хтмл странице не обновлялись, а каждое новое значение добавлялось новой строкой на странице хтмл...
 
Сверху Снизу