Попробую, конечно. Но где-то я вычитал, что библиотеки ESP такую скорость не поддерживают.
Это стандартная скорость работы сериала на esp
Посчитайте, наличие скольких ошибок будет зафиксировано, если, скажем, канал передачи тупо устанавливает в 1 четвертый бит. Serial.write(Serial1.read() | 0x10);
Сделал. Количество ошибок не уменьшилось.
Вы меня извините, но обычно УАРТ годами работает без единой ошибки. Ошибок передачи на линии Сериал НЕ БЫВАЕТ.
Проблема либо в коде, либо в соединениях. Либо вы показали нам только часть кода и у вас там еще 100500 функций, которые портят данные, либо у вас контакты постоянно отваливаются, потому что не пропаяны или соединены на болтающихся стяжках.
Никаких других причин быть не может.
Вы сделали то что я вам советовал в посте 14?
@Optron
Я смотрю ваши темы - вы в той или иной форме воюете с передачей по УАРТ с середины июня. Может, это самое… пора взрослеть? Учиться отлаживать код грамотно, а не вслепую менять параметры железа и строчки кода?
Для начала выкиньте из обоих кодов ВСЕ, что не касается Сериал - всю эту работу с сетью, HTTP-запросы и прочую муть. ЕСП посылает пакет - ардуина принимает. БОЛЬШЕ НИЧЕГО.
Посмотрите, будет ли работать.
Пока не добьетесь, чтоб работало - ничего в код не добавляйте.
Как заработает - начинайте добавлять обратно то, что удалили. Небольшими порциями. И постоянно проверяйте, что УАРТ не “сломался”. Пока не отладили одну порцию - к другой не переходите.
Точно что ли?
Вы отладкой через serial принципиально не пользуетесь?
Попробуйте снизить напряжение питания ардуино до 3.5 В или как- нибудь иначе согласовать лог уровни
В кратчайшее время, постепенно, отвечу на вопросы, заданные мне.
А пока скажу, что у меня была и почти такая мысль, как в #29 от Дим-мычъ.
И поделюсь своими изысканиями.
Решил проверить - на каком этапе возникают ошибки.
С этой целью сократил скетч ESP до минимума:
#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(115200);
delay(100);
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
}
server.on("/s", razborki);
server.begin();
}
void loop()
{
server.handleClient();
}
void razborki()
{
server.send(200, "text/plain", server.arg(0)); // arg(0) из GET-запроса - возвращаю обратно
}
Этот фрагмент программы (Delphi) на компьютере отправляет GET-запрос.
procedure TForm1.Button5Click(Sender: TObject);
var idHttp: TIdHTTP;
out_str, inp_str: string;
begin
out_str := '12345678901234567890'; // строка для отправки 20 символов
try
idHttp := TIdHTTP.Create(nil);
try
IP := trim(Form1.Edit1.Text); // IP-адрес из настроек
inp_str := idHttp.Get('http://' + IP + ':10200/s?s=' + out_str); // GET-запрос
Form1.Label1.Caption := inp_str; // inp_str вывожу на форму
application.ProcessMessages;
finally
idHttp.Free;
end;
finally
end;
// и дальше сравниваю отправленную строку с принятой
// строки совпадают!
if (inp_str = out_str) then Form1.Label3.Caption := inp_str + ' OK'
else Form1.Label3.Caption := 'Error';
end;
Получаю такую же строку.
Значит, ошибка пороисходит при передаче аргумента в ARDUINO через Serial.
Либо надо посмотреть в сторону GPIO.
Либо подумать о согласовании уровней ESP TX с ARDUINO RX.
Или при обработке принятых данных
Да. Вот это и заставило меня проделать то, о чем я расписал в #30.
Это интересно. Попробую.
Может быть их не бывает при согласованных уровнях?
Пользуюсь. А еще у меня есть для отладки “светофор”: три светодиода.
Попробую поставить транзистор в режиме ключа от ESP к ARDUINO. Но там надо будет ещё сигнал инвертировать.
Начните с того, что создайте такие же минимальные скетчи для ЕСП и ардуино, которые обмениваются данными через сериал
Выложите их на форум
ESP01
#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(115200);
delay(100);
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
}
server.on("/s", razborki);
server.begin();
}
void loop()
{
server.handleClient();
}
void razborki()
{
Serial.println(server.arg(0)); // один единственный аргумент из GET-запроса передаю в 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 не ответила
}
}
Arduino
String stroka;
byte colwo = 0;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
Serial.begin(115200);
}
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 " + stroka + String(colwo));
}
else
{
digitalWrite(13, 1);
Serial.println("OK " + stroka + String(colwo));
}
stroka = "";
colwo = 0; // количество нужных символов: цифр и точек
}
else
{
if ((byte) priem != 13)
{
if (((priem >= '0') && (priem <= '9')) || (priem == '.'))
{
stroka += priem; // приклеиваю ТОЛЬКО нужный символ
colwo++;
}
}
// если строку 35 заменить на: if (true),
// то colwo=28, но stroka в строке 26 приходит в ESP с искаженным символом
}
}
}
это все что?
Вы читать умеете? Я вам написал
ESP01 с ардуины по AT-командам “рулить” можно было. Чем не понравилось?
В коде Arduino я работу с сетью не вижу.
Код ESP сейчас буду пробовать такой:
const int period = 1000;
unsigned long moment;
void setup()
{
Serial.begin(115200);
}
void loop()
{
if (millis()-moment>period)
{
Serial.println("123456789.12.3123456789.12.3");
moment+=period;
}
}
Только при чем здесь работа с сетью, если в интернет обратно уходит то, что пришло - не понятно.
МММ направляет меня на верный путь.
Но есть еще непонятки.
Выполнил его рекомендации из #34.
Вот скетч ESP:
const int period = 1000;
unsigned long moment;
void setup()
{
Serial.begin(115200);
}
void loop()
{
if (millis()-moment>period)
{
Serial.println("123456789.12.3123456789.12.3");
moment+=period;
}
}
Вот скетч Arduino:
int st;
String stroka;
byte colwo = 0;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
Serial.begin(115200);
}
void loop()
{
if (Serial.available() > 0)
{
char priem = Serial.read();
if (priem == '\n')
{
st++;
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(String(st)+" ERROR " + stroka +' '+ String(colwo));
}
else
{
digitalWrite(13, 1);
Serial.println(String(st)+" OK " + stroka +' '+ String(colwo));
}
stroka = "";
colwo = 0; // количество нужных символов: цифр и точек
}
else
{
if ((byte) priem != 13)
{
if (((priem >= '0') && (priem <= '9')) || (priem == '.'))
{
stroka += priem; // приклеиваю ТОЛЬКО нужный символ
colwo++;
}
}
// если строку 35 заменить на: if (true),
// то colwo=28, но stroka в строке 26 приходит в ESP с искаженным символом
}
}
}
Работает почти четко. За 840 циклов было несколько ошибок.
В строке 28 (arduino) перед " ОК " стоит пробел. Один раз при выводе этот пробел пропал: "ОК ".
Другой раз пробел был вместо буквы “О”: " К ". Еще в двух случаях пропадало по одному символу.
Значит, ошибка возникает в этом месете (ESP): Serial.println(server.arg(0)); ???
Но при отправке server.arg(0) в интернет: server.send(200, “text/plain”,server.arg(0)); ошибок не замечено.
Как это исправить - пока не знаю.
Вот результат работы:
Если символы пропадают, то это уже таксебе симптомы.