ЕСП на борту с мегой не работает.Phisik, 21 Дек. 20, 12:10
Уже понял. Заменил пока на Wemos D1.
Подключите ЕСП просто к компьютеру и посмотрите, что она там шлет в UART. Можете ей пинг попосылать и посмотреть ответ.Phisik, 21 Дек. 20, 12:10
Попробую конечно. Но вроде как если поставить MQTT_SERIAL_PING_CHECK 1 и MQTT_DEBUG 1, то видно что передает, что принимает.
Одновременно можно все действия понять глядя в mqtt.cpp
Это периодическая посылка данных MEGA -> ESP:
[MQTT][MEGA] Sent: lcd1=D9 N= 0 O= 0
[MQTT][MEGA] Sent: lcd2=Dt= 0 It= 0
[MQTT][MEGA] Sent: IspReg=101
[MQTT][MEGA] Sent: StatMachine=0
[MQTT][MEGA] Sent: DDopInfo=0
[MQTT][MEGA] Sent: t_kub=230
[MQTT][MEGA] Sent: t_col=0
[MQTT][MEGA] Sent: t_tsa=0
[MQTT][MEGA] Sent: work_time=00:09:18
Это я кнопку вправо нажал в Вебе и ЕСП передала ее Меге
[MQTT][MEGA] Rcvd: keystrokes=R
Т.е. обмен идет нормально
Но вот
[INFO][MEGA] Starting ping-pong UART test. Sending ping...
Ага, это в функции void handleMqttSerial() (Получение данных от ESP):
if (millis() - lastUartSendPingTime > pingPeriod) {
#if MQTT_DEBUG
DEBUG_SERIAL.println(F("[INFO][MEGA] Starting ping-pong UART test. Sending ping..."));^M
#endif // MQTT_DEBUG
lastUartSendPingTime = millis();
MQTT_SERIAL.println("ping");
}
По таймеру (const int pingPeriod = 14444) пора посылать сообщение "ping" и ждать на него ответ.
А ответа нет. Нет уже 2 минуты.
Тогда переинициализируется UART.
if (millis() - lastUartRcvPingTime > 123456L) {
lastUartRcvPingTime = millis();
MQTT_SERIAL.begin(MQTT_SERIAL_BAUDRATE, MQTT_SERIAL_MODE);
DEBUG_SERIAL.println(F("[WARN][MEGA] MQTT UART seems to lost connection. Reinitializing UART..."));
}
Т.е. остальной обмен идет в обе стороны и может продолжаться несколько часов. А ответ на "ping" так ни разу и не пришел.
Хотя мы ждем
// answer to ping from ESP
if (strncmp_P(uartBuffer, PSTR("ping"), MQTT_BUFFER_SIZE) == 0) {
#if MQTT_DEBUG
DEBUG_SERIAL.println("[INFO][MEGA] Ping was received. Sending pong...");
#endif // MQTT_DEBUG
lastUartRcvPingTime = millis();
MQTT_SERIAL.println("pong");
currentIndex = 0;
break;
}
И черт бы с ним, если бы все это работало. Но оно через неопределенное время виснет. По крайней мере имею в виду себя. Точнее виснет на уровне ESP->MQTT, а через некоторое время и Веб. Хотя Мега при этом и железные кнопки работают. Было бы хуже, если наоборот.
Разбираться кто там и что, тем более, что код для ESP закрыт, не хочется.
Тем более, что можно применить пусть не решение, ugly hack - отловить момент зависона ЕСП и ресетнуть его. Благо поднимается он за несколько (6-8) секунд и на основной процесс не влияет. Но управлять с дивана приятнее
Вот для этого и хотел убедиться, что действительно на "ping" должен прийти ответ.
Я уже и без возврата каретки (\n) ловил, и "pong" вместо "ping". Хотя посмотрел в двоичном файле прошивки, ping есть, pong'а нет.
ЗЫ Завернул все в спойлер, чтоб такая портянка глаза не мозолила, но все моргать стало. Видно не любит много вложенностей. Убрал, не моргает, но все видно