Optron
29.Сентябрь.2024 14:48:46
1
Необходимо, чтобы 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. Таким образом фиксирую наличие ошибки.
А вопрос такой. Можно ли избежать ошибок при передаче или уменьшить их количество?
Спасибо.
BOOM
29.Сентябрь.2024 14:53:40
2
Никаких ошибок там в принципе быть не должно.
Ты же понимаешь, что передаешь в ESP не «байты», а вполне себе строковые данные?
Без кода о чем либо еще говорить бессмысленно.
ЗЫ: Устройство в настоящий всамделешный интернет «торчит»? Может его просто другие братья/боты ддосят?))
1 лайк
Optron
29.Сентябрь.2024 15:40:59
4
Вот скетчи.
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;
}
}
}
Optron
29.Сентябрь.2024 15:45:19
5
Понимаю.
Код в #4 .
Торчит. Коллега из другого города пробовал. И пинг походит.
BOOM
29.Сентябрь.2024 16:08:02
6
Optron:
И пинг походит
Ну пинг, видимо, роутер отдаёт.
1 лайк
BOOM
29.Сентябрь.2024 16:11:30
8
Да у тебя там так намешено, капец просто)))
То строки, то байты, то символы и всё в «колбасном фарше» ))
1 лайк
Optron
29.Сентябрь.2024 16:19:18
10
sadman41:
Куда приходит?
В интернет отправляю через GET-запрос строку:
230110025.51.3230110025.51.3
Эта строка приходит на ESP. А от ESP в Arduino .
В ней две одинаковые группы по 14 байт.
В Arduino сравниваю байт 0 с байтом 14, …, байт 13 с байтом 27. Таким образом фиксирую наличие ошибки.
Optron
29.Сентябрь.2024 19:00:19
12
Замеетил, что ошибки возникают даже при GET-запросе на такой IP-адрес:
‘http://192.168.0.62 :10200/s?s=230110025.51.3230110025.51.3’
MMM
29.Сентябрь.2024 19:32:35
13
даже не проверяя предварительно, а есть ли в принятой строке 14-й или 27-й байт…
1 лайк
MMM
29.Сентябрь.2024 19:37:20
14
в этой фразе проблема с логикой.
Из того, что “ардуина реагирует не так”, вовсе не следует, что набор приходит неверно.
Для начала я бы подключил к ЕСП вместо Ардуины Уарт-USB и посмотрел вживую, что он принимает и отправляет в линию.
1 лайк
Optron
29.Сентябрь.2024 19:42:57
15
В новом скетче (не в этом) я эту проверку добавил. 28 символов приходило в Arduino СТАБИЛЬНО.
MMM
29.Сентябрь.2024 19:44:05
16
такие заявления - верный способ, чтобы вам перестали помогать
1 лайк
Optron
29.Сентябрь.2024 19:52:56
17
Когда я писал #12 , то подумал о такой проверке.
Optron
29.Сентябрь.2024 19:56:35
18
Похоже, что я эту проблему решил.
Кое что проделал - ошибки исчезли.
Сейчас поэкспрементирую, чтобы убедиться: в этом ли причина.
Optron
30.Сентябрь.2024 18:17:14
19
Проблема не решилась.
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++;
}
}
}
}
}