Помогите "зеленому" человеку прочитать 16-битное значение
- Войдите на сайт для отправки комментариев
Пт, 17/06/2016 - 22:07
Уважаемые знатоки, проблемка.
Очень удобная весЧь, но человеку малоопытному достаавляет немало гемора.
Работает по интерфейсу 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
В чем может быть проблема?
Уже много дней "башкой бьюсь" и все не пробью эту ... проблемку.
Когда я считываю значение переменной val оно не бывает больше - 120-с-копейками..
Потому что Serial.read - читает один байт, а максимальное положительное значение байта со знаком знаешь какое? Как раз "120-с-копейками" где-то.
Если нужно прочитать int - читайте int, у Stream есть методы parseInt, readBytes - пользуйтесь.
З.Ы. Да, Serial наследуется от Stream, т.е. имеет все эти методы тоже. Это чтобы не возникало вопросов вида "где я Stream возьму???".
Конечно, я тоже новичок в ардуино. Но, как знаю в c++ можно приводить типы. Где:
может заработает?
З.Ы Упс, опоздал...
Конечно, я тоже новичок в ардуино. Но, как знаю в c++ можно приводить типы.
Как соотносится приведение типов с тем фактом, что Serial.read, по сути, читает ОДИН байт из потока? И возвращает ОДИН байт? Вы там хоть обприводитесь, но байт останется байтом.
Суть в том, что "посылка" от девайса выглядит примерно так (в полном объеме): 0X65 0X00 0X02 0X01 0XFF 0XFF 0XFF. Из всей этой посылки меня интересуют только первые 2 (реже 3) байта. Реально ли через readBytes(); прочесть только 2й? (первый байт я отсекаю break-ом еще в первом проходе цикла.
Да знаю я, как пакет у Nextion выглядит. И да - с помощью readBytes реально прочесть столько байт, сколько нужно.
А какой readBytes? Stream-мовский или Serial? Увы девайс не у меня, на данный момент, на практике проверить смогу только в понедельник.
Впервые зарегился на форуме и обращаюсь за помощью ... Подозревал, что ответ будет как раз примерно к понедельнику. Я это..."спасибки" хотел сказать... Мне реально, впервой за помощью обращаться
readBytes - метод класса Stream, потомком которого является класс HardwareSerial, экземпляр которого, в свою очередь, определён как Serial. Так что спокойно пишите Serial.readBytes и всё.
Только почитайте документацию к Serial.readBytes пока, чтобы потом не возникало вопросов: https://www.arduino.cc/en/Serial/ReadBytes
Пробовал когда-то (с пару недель назад) Serial.readBytes(); что-то, тогда с ним не пошло... Обязательно перепробую, как за девайс сяду! А Serial.peek(); (только что на глаза попался) сможет мне помочь в 2 байта считать онную инфу? Дальше клеить их буду...
Есть способ сымитировать прием 0X00 на дуньку по UART-у? Уж больно тяжело будет ждать 2 дня
Имитация в дуньке приёма двух байт:
Или я чего не понял? Вам надо на Nextion чего послать? Так его можно и без дуньки мацать - подключили к USB-TTL-конвертеру, и вперёд из терминалки туда любые байты слать и смотреть, что в ответ сыпется. Всё крайне просто.
Имел в виду сымитировать данные от несктиона.
Если использовать софтверный сериал и с него передавать данные на UART? Ардунька не поймет что сам себе шлет приветы?
UPD: Не увидел обновления. Ща постараюсь додумать как с программатора ловить байты... (Время суток не располагает к шевелению веществом, увы)
Монитор порта --> юсб-ттл --> TX-rx --> Читаем "дуней", а как обратно в монитор то слать???
Можно и так, можно по всякому, например: по Serial с компа принимаете данные, отправляя байты какой-нибудь терминалкой, в дуньке принимаете и анализируете. Nextion для отладки не нужен, от слова совсем ;)
Я только что узнал шо такое терминалка... так что пока наверн на софтвере остановлюсь. Еще раз благодарю, но наверн не прощаюсь
Ну, в итоге, считывая данные в 4 байта, значения, вроде как считываются верно... Но почему Serial порт стал так тормозить?
Виновата setTimeOut() из steam-овского класса? (Внутрь классов пока заглядывать не научился, не знаю как изменить настройки. Да и стоит ли?)
Да. Только что узнал что виновник TimeOut. И задержка у него 1сек. Стоит ли ее трогать, или все только усугубится?
Поправьте строчку 17 на
Вам же 4 байта надо прочитать, да? Вот и ждите, когда там будут по крайней мере 4.
Огромное спасибо за помощь! Увы природа проблем такова, что чем больше получаешь ответов, тем больше вопросов возникает. Там скетч за 600 стр. перевалил, + то что написан он "быдлокодом", (иначе я пока не научился писать). В общем нужно больше свободного времени и все будет норм. Дмитрий, избавили меня от одной непробиваемой мной преграды)