Всем привет!
Столкнулся с данной проблемой.
Отправляю на дисплей данные,все приходит,все супер.
Потребовалось принимать значения с нажатий кнопок.
И тут понеслось…
Ни в какую не хочет моя ардуинка считывать.
Что только не делал.
Кто может дать дельный совет?
В данном коде используются кнопки с 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); // Пауза перед отправкой следующей команды
}
@Karll3x , как Вы думаете, сколько времени надо дисплею, чтобы он на скорости 9600 принял 3 байта команды и успел отослать ответ?
И сколько времени пройдет между выполнением строк 20 и 26 Вашего скетча?
Некстион начинает отвечать после третьего FF. Но, да, софтварный сериал в данном случае - бег по граблям. Не сейчас отвалится, так через день-неделю. По повелению великого Рэндома.
Понятно, что “после”, а не “до”.
Вопрос был в том, насколько “после”.
И получается, что в 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; // Устанавливаем флаг записи, так как мы начали записывать строку
}
}
}
Попробовал следующим образом.
Тишина...