Странная потеря данных от Nextion

Seva1800
Offline
Зарегистрирован: 18.12.2015

Доброго дня, товарищи.

Появилась задачка вывести на экран информацию с датчика давления (собственно давление и вывести).
У датчик интерфейс RS485. Взял NanoV3, дисплей Nextion и преобразователь интерфейса TTL-RS485
на микросхеме Max485. Собственно датчик посадил на аппаратный UART, для Nextion организовал
программный порт.

На дисплее организованна кнопка для смены единиц измерения. В нем же запрограмировано по нажатию
кнопки отсыл команды (в формате понятном датчику) в ардуинку. Собственно она принимается и просто пересылается в датчик, а ответ датчика
в котором содержится новая ед измерения выводится обратно в Nextion в поле этой кнопки.

Все работает, НО.
Бывает (и часто), что при нажатии кнопки на дисплее не происходит смены, т.е. данные от Nextion
куда-то деваются. Смотрю на код и хоть убей никак не могу понять почему.

Программный порт использует прерывания. Аппаратный вообще не зависим. Друг другу мешать не могут.
Рассуждал так. Порты я не слушаю, так что "проскочить" не могу. Приходит прерывание на softserial
Программа прерывается и библиотека записывает в буфер, что пришло. Даже если в это время что-то уходит или приходит в аппаратный порт это никак не должно влиять по идее. Потом программа возвращется к выполнению.

Но блин теряются сообщения от Nextion... Как так-то?
Даже с если я использую delay все равно ведь прерывания работают и обрабатываются.

[code]
#include
#include
const byte rxPin = 2;
const byte txPin = 3;
String K = "";
// set up a new serial object
SoftwareSerial mySerial (rxPin, txPin);

void setup() {
pinMode(4, OUTPUT); // Пин управления потоком приемопередатчика max485
K.reserve(20);
Serial.begin (9600);
mySerial.begin(9600);
Serial.setTimeout(20); // Время ожидания данных для readString()
mySerial.setTimeout(20); // Время ожидания данных для readString()
cmd ("@253DT?;FF", "t4.txt="); // запрос типа датчика и вывод на экран
cmd ("@253MD?;FF", "t5.txt="); // запрос модели датчика и вывод на экран
cmd ("@253U?;FF", "b0.txt="); // запрос единиц измерения и вывод на экран
}

void loop() {
cmd ("@253PR1?;FF", "t1.txt=");// Запрос давления и вывод на экран в поле t1 дисплея Nextion
delay (20);
if (mySerial.available() > 0) { // если от Nextion пришли данные
K = mySerial.readString(); // читаем их из буфера
cmd (K, "b0.txt="); // засылаем в датчик команду пришедшею из Nextion c выводом ответа в b0
}
}

void cmd (String com, String pos) { // com - команда для датчика, pos - поле в Nextion куда засылать ответ.
String A = "";
A.reserve(20);
digitalWrite(4, HIGH);
Serial.print(com); // Посыл запроса
delay (20); // Задержка. Ждем пока полность произойдет передача команды
digitalWrite(4, LOW); // перевод приемо-передатчика RS485 в режим приема
unsigned long PT = millis();
while (Serial.available() == 0) { // ждем ответа от датчика 100 мс
if (millis () - PT >= 100) {
return;
}
}
A = Serial.readString(); //Если ответ получен читаем его из буфера в виде строки
if (A[4] == 'A') { //Проверка, что в ответе датчика ACK
A = A.substring (7); // Убираем первые 6 символов ответа
byte k = A.length(); // считаем длину строки
A.remove(k - 3); // убираем последние три сивола терминатора ответа ;FF
mySerial.print (pos + "\"" + A + "\""); // выводим на Nextion ответ датчика
mySerial.write (0xFF);
mySerial.write (0xFF);
mySerial.write (0xFF);
}
return;
}

[/code]

b707
Offline
Зарегистрирован: 26.05.2017

просто как предположение из опыта другой ветки - в SoftwareSerial очень маленький буфер, и если у тебя есть задержки в программе - он переполняется и сбрасывается. попробуй убрать delay(20) во второй строке loop()

Seva1800
Offline
Зарегистрирован: 18.12.2015

Не. буфер не может переполниться. Команда приходящая от кнопки на дасплее занимает байт 10-12.

И сам дисплей по своей инициатеве ничего в порт не шлет.

Такое ощущение, что порт softserial ее просто пропускает, как будто прерывания выключаются.