Опять 25: как из массива байтов -получить число?
- Войдите на сайт для отправки комментариев
Ср, 06/01/2021 - 21:42
Всем доброго, друзья!
Знаю, тема не новая..И гуглил и тут копался на форуме, - запутался короче говоря.
А суть вопроса вот в чем: переделываю кусок чужого кода-под себя. И есть там такой фрагмент (уже все переделал-только на этой ерунде застопорился):
void callback(char* topic, byte *payload, unsigned int length) { byte b [] Motors (topic, СЮДА payload); Serial.println("-------new message from broker-----"); Serial.print("channel:"); Serial.println(topic); Serial.print("data:"); Serial.write(payload, length); // вот эти данные надо передать в мою функцию, которая в самом начале - Motors (topic, СЮДА payload); Serial.println(); }
В коде выше вставил комментарий, что и куда надо передать. Не могу сообразить как мне из массива байт -получить int? Понимаю, что сразу будут вопросы- "а ты уверен, что там int, а исключение не выкинет?"
Уверен. Там будет 1 или 0.
Если либо 0 либо 1, то достаточно взять младший байт.
P.S. в самом начале кода это я не дописал "byte b []" - хотел какой то умный конверт сотворить, но так и не придумал. Пошел побираться по людям :-)))))
Если либо 0 либо 1, то достаточно взять младший байт.
Например, это как? В цикле просмотреть массив и взять меньшее число?
Не меньшее, а первое (при условии, что массив - это целое число little-endian).
Соответственно, просматривать в цикле ничего не нужно.
Сначала нужно знать, как это число закодировано в массив.
Поэтому я и написал "при условии". А так - да, может, оно строкой закодировано.
Мне кажется, что тут надо разбираться не с передачей, а с приемом. Правильно принимайте, то что сами и передаёте. А то какой-то write() - print() и правильный прием!
неизвестно, к сожалению(закодировано строкой или как еще). Там библиотека используется и как там происходит обработка-хз абсолютно. Ок...если для верности этот массив считать в строку, потом оттуда спарсить int...Гемор конечно. А учитывая, что это команды на управление роботом и это может привнести ненужный лаг...Напрямую бы достать эти 1 или 0 из этого массива...Там тупо 1 или 0: едет/не едет.
неизвестно, к сожалению(закодировано строкой или как еще). Там библиотека используется ...
Дык представьте эту библиотеку. Мы уж её попотрошим намедни. Если желание будет, а так и сами можете.
неизвестно, к сожалению(закодировано строкой или как еще). Там библиотека используется и как там происходит обработка-хз абсолютно. Ок...если для верности этот массив считать в строку, потом оттуда спарсить int...Гемор конечно. А учитывая, что это команды на управление роботом и это может привнести ненужный лаг...Напрямую бы достать эти 1 или 0 из этого массива...Там тупо 1 или 0: едет/не едет.
Ну, до тех пор, пока это неизвестно, говорить не о чем.
Так что нужно выяснить: либо изучением исходников, либо, если эти байты откуда-то поступают, то тупо распечатать их и попытаться реконструировать принцип "кодирования".
Ок, библиотека называется PubSubClient.h
И выглядит так:
В моем случае, кусок кода, который использует эту библиотеку выглядит так, как ниже.
Я всего лишь дописываю в нем, чтобы он при получении новой команды от MQTT брокера, - не только выводил ее на экран, но и сразу кидал ее на исполнение-двигателям (функция Motors () ):
А функция
Motors(); как выглядит?
Ничего интересного-это моя самописная. С ней всё ок. Там она распознает:
а) из какого топика пришло сообщение
б) включить/выключить.
То есть, пришло из топика "robot1/left" -сообщение "1" - значит включаем поворот влево. Ну и т.д.
То есть, что я хочу сказать: я ее могу переделать под прием любой информации: строки, а потом спарсить оттуда число и т.д. Мне бы с этими байтами разобраться- а Motors() я потом под это подгоню...
То есть, что я хочу сказать: я ее могу переделать под прием любой информации: строки, а потом спарсить оттуда число и т.д. Мне бы с этими байтами разобраться- а Motors() я потом под это подгоню...
Думаю, тогда смотреть, что приходит, длинна и значения в массиве playload, по этому топику. Там же только два варианта, я так понимаю.
Всегда считал что MQTT позволяет обмениваться только текстовыми данными :)
Мне кажется , что пэйлоад это набор символов, а то что они объявлены как байт скорее всего связано с разбором сетевых пакетов на более низком уровне.
Попробуйте сделать так:
Станет понятно какие данные приходят.
Всегда считал что MQTT позволяет обмениваться только текстовыми данными :)
Мне кажется , что пэйлоад это набор символов, а то что они объявлены как байт скорее всего связано с разбором сетевых пакетов на более низком уровне.
Да, там скорее всего в ascii кодировке, что то типа "On" и "Off".
Ок, библиотека называется PubSubClient.h
Ок, всё понятно, проблема в пятой переменной. Правьте.
Всегда считал что MQTT позволяет обмениваться только текстовыми данными :)
Мне кажется , что пэйлоад это набор символов, а то что они объявлены как байт скорее всего связано с разбором сетевых пакетов на более низком уровне.
Попробуйте сделать так:
Станет понятно какие данные приходят.
Ок, протестировал только что. Выдало вот это:
Ок, библиотека называется PubSubClient.h
Ок, всё понятно, проблема в пятой переменной. Правьте.
поясните, плиз. Не совсем понимаю, что и где :-)
Ок, протестировал только что. Выдало вот это:
Ну дык вы получили один байт 0x31 - символ "1". Какие вы хотите собирать значения из массива. У вас массив всего 1 байт. Его и анализируйте.
А какой мотор выясняете по topic .
Ок, спасибо за помощь!
P.S. выяснение топика я уже сделал. Завис только на байтах :-)
.
Еще раз, всем участвовавшим в топике-спасибо, все отладил, всё запустилось и отлично работает. Кстати, как ни странно, несмотря на работу управления по схеме: пульт на сайте-mqtt брокер - робот, - лаг на прохождение команд визуально отсутствует. Может какие то миллисекунды и есть, но это не играет роли :-)
При отладке прошивки с одной озадачившей меня вещью столкнулся (я сам по java так то):
пишу: char temp =1 ;
Ошибок нет, всё ок. Но не работает ни черта!
Попробовал назначить в явном виде:
char temp = '1' ; - и всё заработало сразу! Вот как так и что это было? Может кто прояснит? О_о
До чего Java-то доводит...
https://en.wikipedia.org/wiki/ASCII
В таблице " Control code chart" ищем "Start of Heading", а в таблице "Printable characters" ищем Glyph '1'. Сравниваем их по Binary/Oct/Dec/Hex , размышляем о смысле жизни.
При отладке прошивки с одной озадачившей меня вещью столкнулся (я сам по java так то):
пишу: char temp =1 ;
Ошибок нет, всё ок. Но не работает ни черта!
Попробовал назначить в явном виде:
char temp = '1' ; - и всё заработало сразу! Вот как так и что это было? Может кто прояснит? О_о
Это С++, а не Java. ))
При отладке прошивки с одной озадачившей меня вещью столкнулся (я сам по java так то):
пишу: char temp =1 ;
Ошибок нет, всё ок. Но не работает ни черта!
Попробовал назначить в явном виде:
char temp = '1' ; - и всё заработало сразу! Вот как так и что это было? Может кто прояснит? О_о
Это С++, а не Java. ))
Я в курсе :-). Просто удивился сильно, что не приняло. И ошибку не выкинуло.
Какую ошибку вы ждали ? Оно как раз приняло. Ошибки то нет.
Напишите так:
char temp =49 ;
И удивитесь еще раз :)
Ок, очередной раз понял, что "я знаю только то, что ничего не знаю" :-))))
Надо почитать про эти char.
Вам нужно понять разницу между значением (цифрой) и символом (ее отображением в хьман интерфейсах). Очень странно что вы не знаете этой основы программирования любого языка.
Знаю...Вернее учил. Но так как прогаю от случая-к случаю, уже забыл эту теорию.
Но спасибо-наглядный пример.
Знаю...Вернее учил. Но так как прогаю от случая-к случаю, уже забыл эту теорию.
Но спасибо-наглядный пример.
нельзя забыть то, что знал )))
Я бы поспорил :-)))
Я постоянно ловлю себя на том, что "блин, да я же знал это!!!" - но из-за того, что знал только в теории, а не закрепил на практике-в голове не отложилось как следует...
"Учил" и "знал" - разные вещи.