Помогите "зеленому" человеку прочитать 16-битное значение

xeont
Offline
Зарегистрирован: 16.06.2016

Уважаемые знатоки, проблемка.

Есть девайс: http://ru.aliexpress.com/item/2-4-Nextion-HMI-Intelligent-Smart-USART-UART-Serial-Touch-TFT-LCD-Module-Display-Panel-For/32680359394.html?ws_ab_test=searchweb201556_8,searchweb201602_5_10039_10037_10017_507_10032_10040,searchweb201603_7&btsid=8e110c60-b9d3-433d-8ee9-304d3599a879.

Очень удобная весЧь, но человеку малоопытному достаавляет немало гемора.

Работает по интерфейсу UART, отправляя "посылочки". Но посылки отправляет такого формата: 0x00, и когда я ее сохраняю в переменную (неважно какую, перепробовал все от byte до unsigned long). И когда я считываю значение с переменной:

int i;
i = Serial.read();      // Допустим, что отправлено было "125"
int val = i;                  // val = 125


//Но!



int i;
i = Serial.read();      // Допустим, что отправлено было "150"
int val = i;                  // val < 128

В чем может быть проблема?

Уже много дней "башкой бьюсь" и все не пробью эту ... проблемку.

xeont
Offline
Зарегистрирован: 16.06.2016

Когда я считываю значение переменной val оно не бывает больше - 120-с-копейками.. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Потому что Serial.read - читает один байт, а максимальное положительное значение байта со знаком знаешь какое? Как раз "120-с-копейками" где-то.

Если нужно прочитать int - читайте int, у Stream есть методы parseInt, readBytes - пользуйтесь.

З.Ы. Да, Serial наследуется от Stream, т.е. имеет все эти методы тоже. Это чтобы не возникало вопросов вида "где я Stream возьму???".

nurlanovic
nurlanovic аватар
Offline
Зарегистрирован: 16.06.2016

Конечно, я тоже новичок в ардуино. Но, как знаю в c++ можно приводить типы. Где:

i = Serial.read();
i = (unsigned int)Serial.read();

может заработает?

 

З.Ы Упс, опоздал...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

nurlanovic пишет:

Конечно, я тоже новичок в ардуино. Но, как знаю в c++ можно приводить типы. 

Как соотносится приведение типов с тем фактом, что Serial.read, по сути, читает ОДИН байт из потока? И возвращает ОДИН байт? Вы там хоть обприводитесь, но байт останется байтом. 

xeont
Offline
Зарегистрирован: 16.06.2016

Суть в том, что "посылка" от девайса выглядит примерно так (в полном объеме): 0X65 0X00 0X02 0X01 0XFF 0XFF 0XFF. Из всей этой посылки меня интересуют только первые 2 (реже 3) байта. Реально ли через readBytes(); прочесть только 2й? (первый байт я отсекаю break-ом еще в первом проходе цикла.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Да знаю я, как пакет у Nextion выглядит. И да - с помощью readBytes реально прочесть столько байт, сколько нужно.

xeont
Offline
Зарегистрирован: 16.06.2016

А какой readBytes? Stream-мовский или Serial? Увы девайс не у меня, на данный момент, на практике проверить смогу только в понедельник.

Впервые зарегился на форуме и обращаюсь за помощью ... Подозревал, что ответ будет как раз примерно к понедельнику. Я это..."спасибки" хотел сказать... Мне реально, впервой за помощью обращаться

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

readBytes - метод класса Stream, потомком которого является класс HardwareSerial, экземпляр которого, в свою очередь, определён как Serial. Так что спокойно пишите Serial.readBytes и всё.

Только почитайте документацию к Serial.readBytes пока, чтобы потом не возникало вопросов: https://www.arduino.cc/en/Serial/ReadBytes

xeont
Offline
Зарегистрирован: 16.06.2016

Пробовал когда-то (с пару недель назад) Serial.readBytes(); что-то, тогда с ним не пошло... Обязательно перепробую, как за девайс сяду! А Serial.peek(); (только что на глаза попался) сможет мне помочь в 2 байта считать онную инфу? Дальше клеить их буду...

Есть способ сымитировать прием 0X00 на дуньку по UART-у? Уж больно тяжело будет ждать 2 дня

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Имитация в дуньке приёма двух байт:

unsigned int imitation = 0x0000; // в imitation теперь два байта, каждый со значением 0x00

Или я чего не понял? Вам надо на Nextion чего послать? Так его можно и без дуньки мацать - подключили к USB-TTL-конвертеру, и вперёд из терминалки туда любые байты слать и смотреть, что в ответ сыпется. Всё крайне просто.

xeont
Offline
Зарегистрирован: 16.06.2016

Имел в виду сымитировать данные от несктиона.

Если использовать софтверный сериал и с него передавать данные на UART? Ардунька не поймет что сам себе шлет приветы?

UPD: Не увидел обновления. Ща постараюсь додумать как с программатора ловить байты... (Время суток не располагает к шевелению веществом, увы)

Монитор порта --> юсб-ттл --> TX-rx --> Читаем "дуней", а как обратно в монитор то слать???

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Можно и так, можно по всякому, например: по Serial с компа принимаете данные, отправляя байты какой-нибудь терминалкой, в дуньке принимаете и анализируете. Nextion для отладки не нужен, от слова совсем ;)

xeont
Offline
Зарегистрирован: 16.06.2016

Я только что узнал шо такое терминалка... так что пока наверн на софтвере остановлюсь. Еще раз благодарю, но наверн не прощаюсь

xeont
Offline
Зарегистрирован: 16.06.2016

Ну, в итоге, считывая данные в 4 байта, значения, вроде как считываются верно... Но почему Serial порт стал так тормозить?

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // 11 - tx, 10 - rx 

unsigned int imitation = 0xA9;

void setup() {
  Serial.begin (9600);
  mySerial.begin(9600);          

}

long u;
char t[4];
void loop() {
  mySerial.print(imitation);
  delay(20);
  while (Serial.available()) {
  Serial.readBytes(t, 4);
  }
  if (millis() - u > 100) {
    imitation++;
    Serial.write(t);
    Serial.print("   ");
    Serial.print(imitation, DEC);
    Serial.print("   ");
    Serial.print(millis());
    Serial.println();
    u = millis();
  }
  
}

Виновата setTimeOut() из steam-овского класса? (Внутрь классов пока заглядывать не научился, не знаю как изменить настройки. Да и стоит ли?)

Да. Только что узнал что виновник TimeOut. И задержка у него 1сек. Стоит ли ее трогать, или все только усугубится?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Поправьте строчку 17 на 

while(Serial.available() > 3)

Вам же 4 байта надо прочитать, да? Вот и ждите, когда там будут по крайней мере 4.

xeont
Offline
Зарегистрирован: 16.06.2016

Огромное спасибо за помощь! Увы природа проблем такова, что чем больше получаешь ответов, тем больше вопросов возникает.  Там скетч за 600 стр. перевалил, + то что написан он "быдлокодом", (иначе я пока не научился писать). В общем нужно больше свободного времени и все будет норм. Дмитрий, избавили меня от одной непробиваемой мной преграды)