Возникают ошибки при передаче ESP01S -> Arduino UNO

Необходимо, чтобы ESP получил из интернета набор 14-ти байт и передал их через Serial (9600) в Arduino, например: 230110025.51.3

С этой целью я отправляю такой GET-запрос:
http://xx.xxx.x.xx:10200/s?s=230110025.51.3
(xx.xxx.x.xx - статический IP).

Иногда этот набор приходит c ошибками, то есть Arduino реагирует на него не так, как задумано.

Следующий текст для информации. Дабы не заморачиваться с контрольной суммой, я задвоил этот набор:
230110025.51.3230110025.51.3.
В Arduino сравниваю байт 0 с байтом 14, …, байт 13 с байтом 27. Таким образом фиксирую наличие ошибки.

А вопрос такой. Можно ли избежать ошибок при передаче или уменьшить их количество?
Спасибо.

Никаких ошибок там в принципе быть не должно.
Ты же понимаешь, что передаешь в ESP не «байты», а вполне себе строковые данные?

Без кода о чем либо еще говорить бессмысленно.

ЗЫ: Устройство в настоящий всамделешный интернет «торчит»? Может его просто другие братья/боты ддосят?))

1 лайк
  1. Неправильно разбираете get на esp
  2. Неправильно передаёте информацию с esp в порт
  3. Неправильно принимаете информацию из порта на ардуине.
    Выбирайте по вкусу!
2 лайка

Вот скетчи.

ESP01S

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
const char* ssid = "ABRAKADABRA";
const char* password = "19661117";

ESP8266WebServer server(10200);

IPAddress ip(192, 168, 0, 62);
IPAddress dns(8, 8, 8, 8);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

void setup()
{
  WiFi.config(ip, dns, gateway, subnet);
  Serial.begin(9600);
  delay(100);

  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);

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

  server.on("/s", razbor);

  server.begin();

}

void loop()
{
  server.handleClient();
}
void razbor()
{
  String message = "";

  Serial.println(server.arg(0)); // передал в Arduino

  delay(250); // жду ответ от Arduino

  String stroka = "w"; // просто так

  if (Serial.available() > 0)
  {

    while (Serial.available() > 0)
    {
      char sim = Serial.read();
      byte simb = (byte) sim;

      if (!((simb == 10) || (simb == 13))) stroka += sim;

    }
    server.send(200, "text/plain", stroka);   // ответ
  }
  else
  {
    server.send(200, "text/plain", "Oblom"); // ответ
  }
}

Arduino

String stroka;
void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0)
  {
    char priem = Serial.read();
    if (priem == '\n')
    {
      bool prizerror = false;
      for (int i = 0; i <= 13; i++)
      {
        if (stroka[i] != stroka[i + 14]) prizerror = true;
      }
      stroka="";
      if (prizerror == true)
      {
        digitalWrite(13, 0);
        Serial.println("ERROR");
      }
      else
      {
        digitalWrite(13, 1);
        Serial.println("OK");
      }
    }
    else
    {
      if ((byte) priem != 13) stroka += priem;
    }
  }
}

Понимаю.

Код в #4.

Торчит. Коллега из другого города пробовал. И пинг походит.

Ну пинг, видимо, роутер отдаёт.

1 лайк

A к коду есть претензии?

Да у тебя там так намешено, капец просто)))
То строки, то байты, то символы и всё в «колбасном фарше» ))

1 лайк

Куда приходит?

2 лайка

В интернет отправляю через GET-запрос строку:
230110025.51.3230110025.51.3
Эта строка приходит на ESP. А от ESP в Arduino.
В ней две одинаковые группы по 14 байт.
В Arduino сравниваю байт 0 с байтом 14, …, байт 13 с байтом 27. Таким образом фиксирую наличие ошибки.

3 лайка

Замеетил, что ошибки возникают даже при GET-запросе на такой IP-адрес:
‘http://192.168.0.62:10200/s?s=230110025.51.3230110025.51.3’

даже не проверяя предварительно, а есть ли в принятой строке 14-й или 27-й байт…

1 лайк

в этой фразе проблема с логикой.
Из того, что “ардуина реагирует не так”, вовсе не следует, что набор приходит неверно.

Для начала я бы подключил к ЕСП вместо Ардуины Уарт-USB и посмотрел вживую, что он принимает и отправляет в линию.

1 лайк

В новом скетче (не в этом) я эту проверку добавил. 28 символов приходило в Arduino СТАБИЛЬНО.

такие заявления - верный способ, чтобы вам перестали помогать

1 лайк

Когда я писал #12, то подумал о такой проверке.

Похоже, что я эту проблему решил.
Кое что проделал - ошибки исчезли.
Сейчас поэкспрементирую, чтобы убедиться: в этом ли причина.

Проблема не решилась.
Arduino стабильно получала от ESP 28 символов. Я передаю только цифры и точку.
Когда я в этот скетч добавил фильтр на цифры и точку (строки 35-39), то количичество нормальных принятых символов уменьшилось.
Скорее всего проблема с ESP.

String stroka;
byte colwo = 0;
void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0)
  {
    char priem = Serial.read();
    if (priem == '\n')
    {
      bool prizerror = false;
      for (int i = 0; i <= 13; i++) if (stroka[i] != stroka[i + 14]) prizerror = true;
      if (prizerror == true)
      {
        digitalWrite(13, 0);
        Serial.println("ERROR " + String(colwo));
      }
      else
      {
        digitalWrite(13, 1);
        Serial.println("OK " + String(colwo));
      }
      stroka = "";
      colwo = 0;
    }
    else
    {
      if ((byte) priem != 13)
      {
        if (((priem >= '0') && (priem <= '9')) || (priem == '.'))
        {
          stroka += priem;
          colwo++;
        }
      }
    }
  }
}

сделайте скорость 115200

1 лайк