Не приходят данные с дисплея Nextion 10.1

Всем привет!
Столкнулся с данной проблемой.
Отправляю на дисплей данные,все приходит,все супер.
Потребовалось принимать значения с нажатий кнопок.
И тут понеслось…
Ни в какую не хочет моя ардуинка считывать.
Что только не делал.
Кто может дать дельный совет?
В данном коде используются кнопки с 2-умя позициями.


SoftwareSerial nextionSerial(19, 18); // Подключите дисплей к пинам 0 (RX) и 1 (TX)

void setup() {
  Serial.begin(9600); // Начнем мониторить порт на Arduino
  nextionSerial.begin(9600); // Начнем мониторить дисплей
}

void loop() {
  // Отправляем команду для установки значения в поле x0
  nextionSerial.print("x0.val="); // x0 - это имя компонента на экране
  nextionSerial.print(255); // Значение, которое вы хотите установить
  nextionSerial.write(0xff); // Отправляем байт данных
  nextionSerial.write(0xff); // Отправляем байт данных
  nextionSerial.write(0xff); // Отправляем байт данных

  delay(100); // Пауза перед следующей командой

  // Отправляем команду для чтения данных с компонента bt0
  nextionSerial.print("get bt0.val"); // bt0 - это имя компонента на экране
  nextionSerial.write(0xff); // Отправляем байт данных
  nextionSerial.write(0xff); // Отправляем байт данных
  nextionSerial.write(0xff); // Отправляем байт данных

  // Считываем ответ с компонента bt0
  String response = "";
  while (nextionSerial.available()) {
    char receivedChar = nextionSerial.read();
    response += receivedChar;
  }

  // Выводим ответ в монитор порта Arduino
  Serial.println("Значение bt0: " + response);

  delay(100); // Пауза перед отправкой следующей команды
}

что вы ожидаете увидеть в строке 32?
ну например вам нехтион послал последовательность - 0х01 0х00 0х01.

Возьми библиотеку и не усложняй себе жизнь лишней работой.

Вот это плохой вариант в случае приёма.
На компоненте чекнуто “отправлять ивент”? В дебаггере видно, что уходит пакет?

@Karll3x , как Вы думаете, сколько времени надо дисплею, чтобы он на скорости 9600 принял 3 байта команды и успел отослать ответ?
И сколько времени пройдет между выполнением строк 20 и 26 Вашего скетча?

Некстион начинает отвечать после третьего FF. Но, да, софтварный сериал в данном случае - бег по граблям. Не сейчас отвалится, так через день-неделю. По повелению великого Рэндома.


222

Некстион отвечает после того, как while чек делает.

Нужно ждать поступления в буфер , потом вычитывать до заданного терминатора. И на все повесить счётчик таймаута.

Я ставлю 200мс на 9600. Но, иногда, при сложных скринах, этого не хватает. Увеличиваю до 400.

Понятно, что “после”, а не “до”.
Вопрос был в том, насколько “после”.
И получается, что в 20-й строке мы запихнули в буфер первое число, в 21 - второе, а в 22-й - третье. Сколько времени это заняло. Ну от единиц до максимум десятков мкс. Порт МК закончит передачу никак не раньше 3*10/9600=3125 мкс. А в 25 строке мы окажемся гораздо раньше. А что мы делаем в 25-й строке? А, в общем-то, ничего: место под нее зарезервировано в стеке уже давно - в момент вызова loop(), ну, может, только записать пару нулей - один в начало поля данных, другой - в поле длины строки.
К моменту достижения 26-й строки дисплей еще не успел принять команду, и тем более - никак не мог на нее хотя бы начать отвечать.
Т.е. 26-ю строку мы пролетаем сразу до 30-й.
Вот в задержке на 34-й строке дисплей, вероятно, успел принять команду и ответить на нее, но мы, не читая результат, уже начинаем бомбардировать следующей последовательностью команд.

Отправляя команду, следует дождаться ответа, а не обнаружив, что в буфере ничего нет (а оно просто не могло успеть появиться), заходить на следующий круг.

Возражений нет. Я о том же и написал ранее.

#include <SoftwareSerial.h>

SoftwareSerial nextionSerial(19, 18); // Подключите дисплей к пинам 0 (RX) и 1 (TX)

void setup() {
  Serial.begin(9600); // Начнем мониторить порт на Arduino
  nextionSerial.begin(9600); // Начнем мониторить дисплей
}

void loop() {
  static String inputString = ""; // Создаем строку для хранения входных данных
  bool isRecording = false; // Флаг для определения, записываем ли мы строку

  while (nextionSerial.available()) {
    char receivedChar = nextionSerial.read(); // Считываем символ из порта
    if (receivedChar == 'f') {
      if (isRecording) {
        Serial.println(inputString); // Выводим строку в последовательный порт Arduino
        inputString = ""; // Очищаем буфер для следующей строки
        isRecording = false; // Сбрасываем флаг записи
      }
    } else {
      inputString += receivedChar; // Добавляем символ в текущую строку
      isRecording = true; // Устанавливаем флаг записи, так как мы начали записывать строку
    }
  }
}
Попробовал следующим образом.
Тишина...
void setup() {
  Serial.begin(9600); // Начнем мониторить порт на Arduino
  Serial1.begin(9600); // Начнем мониторить дисплей Nextion (порт Serial1)
}

void loop() {
  while (Serial1.available()) {
    char receivedChar = Serial1.read(); // Считываем символ из порта Serial1
    Serial.print(receivedChar); // Выводим символ в последовательный порт Arduino (монитор порта)
  }
}

И даже так пробовал)
Тишина полнейшая.
Подключение верное,т.к на дисплей инфа уходит отлично.

Тогда только соединения проверять. Уходит по одному проводу, но приходит по другому.
С нормальным сериалом проблем не возникает с некстионом.