nextion (часть 6 - костыль решение)

В данный форум Вы можете заносить найденные Вами ошибки.При добавления ошибки пожалуйста приложите файлик error.log который находится в папке с установленной программой
Ответить
findeler
Рядовой
Сообщения: 76
Зарегистрирован: 16.07.2016{, 08:31}
Репутация: 0
Откуда: Рязань

nextion (часть 6 - костыль решение)

#1

Сообщение findeler » 01.09.2016{, 09:43}

Проблема связанна с некорректным кодом блока. А именно:

nextionSendCommand(_nextionCommandTempString.c_str(), 0);
_nextionTempLissen = nextionListen(0);

Между посылкой запроса, и чтением значения нет паузы и nextion просто не успевает ответить.

Но если посмотреть саму функцию то пауза есть.
...
struct _nextionLissenStruct nextionListen( byte port )
{
char _bite;
char _end = 0xff;
String cmd;
_nextionLissenStruct temp;
int countEnd = 0;

//
delay(10);
//

while(Serial.available()>0){
if(Serial.available()>0){
_bite = Serial.read();
cmd += _bite;
if(_bite == _end){countEnd++;}
if(countEnd == 3){break;}
...

Но её явно недостаточно, если установить значение delay(30) то начинает работать, но выдаёт ошибку (нулевое значение) если в этот момент совершать действия на некстионе (Я нажимаю кнопку, на дисплее и на выходе блока проскакивает ноль), при значении delay(40) ошибок не выдаёт. НО подозреваю, что при сложной графике на дисплее, переключении страниц, отрисовке фигур... задержку надо будет ещё увеличить. Поэтому грубо можно предположить, что задержка в районе 60-100 мс будет достаточна.

Такое решение неприемлемое. Но как костыль для начала сойдёт.
Ведь если необходимо опрашивать 100 кнопок на некстион, то задержка программы только на опросе кнопок составит 6-10 сек ! То есть надо задержку заменить на таймер условие.

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

Сам код имеет вид

_nextionCommandTempString = "get main.va0.val";
nextionSendCommand(_nextionCommandTempString.c_str(), 0);
_nextionTempLissen = nextionListen(0);
if(_nextionTempLissen.code = 'q') {_nextionGetValue1_outputValue = _nextionTempLissen.number;};

Если заменить его на код

_nextionCommandTempString = "get main.va0.val";
nextionSendCommand(_nextionCommandTempString.c_str(), 0);
_nextionTempLissen = nextionListen(0);
if(_nextionTempLissen.code = 'q') {_nextionGetValue1_outputValue = 1;}; // !!!!

То на выходе появится 1, то есть условие _nextionTempLissen.code = 'q' выполняется. А вот откуда там 'q' берётся непонятно. Оно должно появляться только тогда когда nextion ответил.

Цитирую оттуда: https://www.itead.cc/wiki/Nextion_Instruction_Set

0X71 Numeric variable data returns 0X71+variable binary data(4 bytes little endian mode, low in front)+End
When the variable obtained by get command is value, this data returns.
Instance:0X71 0X66 0X00 0X00 0X00 0XFF 0XFF 0XFF
Meaning:return value data:102

P.S. У меня 7 дюймовая модель некстиона 800х600 возможно он работает медленнее чем модели с меньшим разрешением.

Добавлено (23.08.2016, 05:10)
---------------------------------------------
С перекладкой кода на Си всё печально. Грубо говоря реализовать нормальную работу отдельных блоков без задержек нереально. То есть нужно писать глобальный обработчик чтения записи в некстион, со своим стеком. То есть используя текущий способ визуализации, у меня это будет блок многоножка с 200-300 входами, что не реально.

Добавлено (01.09.2016, 09:43)
---------------------------------------------
Всё оказалось ещё много печальнее. Пришлось уйти на СТМ32. Там это оказалось как раз очень несложно.
Последний раз редактировалось findeler 22.08.2016{, 09:41}, всего редактировалось 1 раз.

Ответить

Вернуться в «Новые»