Побайтное получение из Serial порта переменной (любой)
- Войдите на сайт для отправки комментариев
Сб, 14/01/2017 - 03:09
Из порта получаю байт (условно считаем , что данные в буфере всегда верные и соответствуют "заполняемой" переменной)
Делаю я это так :
//прочитали начало пакета,читаем номер транзакции unsigned long trans_id=0; //указатель на тип массив байт byte* sensor_data_adr; //получили реальный адрес первого байта переменной trans_id sensor_data_adr=(byte *)(& trans_id); //записываем значения побайтно *(sensor_data_adr)=this->read(); *(sensor_data_adr+1)=this->read(); *(sensor_data_adr+2)=this->read(); *(sensor_data_adr+3)=this->read();
в примере получаю unsigned long - 4 байта.
Верно ли я это делаю, т.к. именно в этом месте частенько намертво виснет программа ?
P.S.: this
->read(); = Serial.read()
Дабы у читателей не было сомнений отвечу сам себе - код верный. Глючило это место в моем случае из-за нехватки памяти у про мини, на уно передача таким образом любых объектов идёт без сбоев.
Глючило это место в моем случае из-за нехватки памяти у про мини
Некорректная фраза. Pro Mini и UNO обычно на одинаковых микроконтроллерах - Atmega328P, с одинаковым количеством динамической памяти 2КБ. А вам видимо попалась Pro Mini на Atmega168PA c 1КБ SRAM. В таком случае так и пишите - нехватка памяти у Atmega168PA.
Вот он истинный троль ! По делу молчит, но чего-то учит.
Код верный. Дальше лирика и нечего её даже размусоливать. Если интересно, то ещё я ношу полосатые носки и у меня есть солёные огурцы в холодильнике.
Если интересно, то ещё я ношу полосатые носки и у меня есть солёные огурцы в холодильнике.
на каком контроллере у тебя работает, а на каком не работает?
Вот он истинный троль ! По делу молчит, но чего-то учит.
Я считаю, что вполне по делу. Не в курсе, различаете ли Вы микроконтроллеры, которые стоят в ардуинах. Мой ответ был скорее для других новичков, которые попадут в эту тему и прочитают Ваше сообщение. У них может сложиться неправильное впечатление, что код не работает на Pro Mini (якобы у ProMini меньше памяти) и нужна только UNO. Но это не так, о чём я и написал.
По теме: повторюсь ещё раз код рабочий.
Всё что ниже, не по теме, только чтобы развлечь лично Вас, раз Вам не скем пословоблудить.
Во первых спасибо, что стёрли МАТ из предыдущего сообщения клона. Неприятно читать, глаза режет
Ваше право )
Не в курсе, различаете ли Вы микроконтроллеры, которые стоят в ардуинах.
Кому интересно - зададут мне этот вопрос сами. Я отвечу. Вам могу ответить так : "Да, я различаю, - зелёненькие с чёрными тычинками мне нравятся больше. А красненькие платы у меня не работают вообще"
Мой ответ был скорее для других новичков,
Вот тут, Вы лукавите, Ваш ответ был предназначен лично мне и никому более , на это указывает и цитирование и Ваше указание. Цитирую Вас "В таком случае так и пишите ..."
Мой ответ был скорее для других новичков,которые попадут в эту тему и прочитают Ваше сообщение. У них может сложиться неправильное впечатление, что код не работает на Pro Mini
Новички не работают с указателями ПО ОПРЕДЕЛЕНИЮ. Если работают - он уже НЕ новичёк. (Моё мнение). Кроме того, я написал "... В МОЁМ СЛУЧАЕ..." , т.е. может я воду пролил на мини и она глючит и т.д., этого я не уточнял. Может я в другом месте с "утечкой" начудил... Может просто в тот день я ударился головой....
(якобы у ProMini меньше памяти) и нужна только UNO. Но это не так, о чём я и написал.
Вы опять не правы, обратитесь к спецификации. "ATmega 168 with this specs:
- Flash memory: 16 KB
- SRAM: 1 KB
- EEPROM: 512 bytes"
Я удовлетворил Вашу тягу к словоблудию ? Пустозвонства больше в этой теме не будет ?
По теме: повторюсь ещё раз код рабочий.
ты ответишь, на каких контроллерах у тебя работает код, а на каких не работает, или будешь продолжать пургу нести?
(якобы у ProMini меньше памяти) и нужна только UNO. Но это не так, о чём я и написал.
Вы опять не правы, обратитесь к спецификации. "ATmega 168 with this specs:
Фейспалм... ProMini != Atmega168. Вернее такие есть конечно, но их меньше. В основном там Atmega328.
Если на то пошло - у Pro Mini вообще нет памяти, память у микроконтроллера. О чём я пытался донести мысль и некорректность Вашего высказывания.
Чего к памяти вобще пристали. Тут только 4 байта задействовано, они везде найдутся.
Код написан хреново, потому и зависает. Правильно сразу проверить, есть ли в приемном буфере требуемое число байт используя Serial.available(); и только потом их извлекать. А если про Serial.readBytes() вспомнить то вобще все просто.
в l поллучим кол-во реально прочитаных, в нашем случае всегда 4, но иногда может быть полезным.
Чего к памяти вобще пристали.
потому, что ТС утверждает, что именно памяти ему то хватает, то не хватает - мы ему верим и не верим.
дихотомия, ёпте.
)) Лиш бы не шизофрения. Предлагаю что ТС просто пожаловался на склероз ;)
Чудики, Вы откуда такие поналезли ? )
Чего к памяти вобще пристали. Тут только 4 байта задействовано, они везде найдутся.
Браво, Вы первый кто это заметил ! Только повнимательнее читайте первый пост с вопросом. Не фантазируйте. ТС не спрашивал почему у него зависат. Вопрос был верно ли побайтно собирается переменная ? Ответ должен быть - Верно. Точка.
Код написан хреново, потому и зависает.
Чему там зависать-то, чудик ? Чего там "хренового" ? Тоже словоблудить желаете, или просто самоутведиться в среде "новичков" ?
Logik (остальные участники темы вообще - порожняк полный) , давай так, раз ты считаешь , что "Код написан хреново, потому и зависает" , то объясни всем в каком случае этот код может "зависнуть" при работе на исправном микроконтроллере (любом, хоть ATTINY13) ? Если ты не сможешь этого сделать, то ты просто фуфлогон, не более.
Я считаю, что там нечему глючить даже теоретически. Так же я считаю, что ты (извини, дружище , но к тебе на Вы не могу себе позволить) не прав.
На ты, так на ты.
//Я считаю, что там нечему глючить даже теоретически.
Это от умственной ограничености. Достаточно получить с канала не все 4 байта и код будет висеть. И ждать с моря погоды. А получить не 4 байта - элементарно, помеха побила, 1 байт, приняли три. А при подключении-отключении и ребутах там вобще прийдет шо хочеш и скоко угодно. После этого, если с канала начнется несинхронизированый прием и данные будут искаженные. И зависания каждый раз при получении некратного 4 кол-ва байт.
Так шо, лошара, учи матчасть. Начни с различия между блокирующим и не блокирующим вызовами. В перерывах подтяни общую культуру общения. А то дерзкий, как пидор, буш еще хамить, пошлю нахер и свои вопросы будеш себе в анал совать.
Код, действительно, написан неверно, о чем Logic совершенно срправедливо упомянул в сообщении №9.
Прежде, чем читать из устройства, следует удостовериться, что там есть что читать. В противном случае при отсутствии там данных, в зависимости от устройства/драйвера вызоб либо заблокирует работу программы до момента появления данных, либо вернет 0xFF, что с вероятностью 99.6% окажется совсем не тем, что нам нужно.
Logik, вся Ваша злость от понятия собственной некомпетентности (узнай про классы, потом прочитай про паттерны программирования), и только потом поймёшь, что я НЕ МОГУ НЕ получить от this->read() байт т.к. ... тут читай самую первую строку самого первого поста темя в скобках, я это написал,потому что я знал что в теме могут быть словоблуды,балаболы и пустозвоны ("не первый день за мужем"), да, да, именно на это случай. На всякий случай дублирую, если ты слеп : условно считаем , что данные в буфере всегда верные и соответствуют "заполняемой" переменной.
Если ты зрелый человек то - уже Logik=ФУФЛОГОН, с доказательствами в этой теме ! Если школьник, то простительно, мне бы тоже было бы стыдно в этом возрасте признаться что я обосрался ...
На этом позвольте раскланяться, завтра рабочий день, но мне было приятно ткнуть Вас в Ваше же го*но культурно и без оскорблений.
<censored>Знание классов и патернов те не помогло. Оценка кода дана КГ/АМ. Зависал, и будет зависать.
На всякий случай дублирую, если ты слеп : условно считаем , что данные в буфере всегда верные и соответствуют "заполняемой" переменной.
Давайте лучше условно считать, что программа намертво не виснет. Тогда и вопроса для обсуждения нет.
Давайте лучше условно считать, что программа намертво не виснет. Тогда и вопроса для обсуждения нет.
Без проблем. После второго поста идёт некоструктивный набор слов, не относящийся к теме.
Даже предлагаю считать всех участноков темы приятными культурными собеседниками.
andriano, Вам отдельное спасибо, за то, что Ваши посты без мата и оскорблений, что , к сожалению, видимо, редкость на этом форуме.
//Даже предлагаю считать всех участноков темы приятными культурными собеседниками.
))) Во чё мат благой делает! Послал раз - стал милым челом, ща втихаря код поправит, как я показал, зависать прога перестанит и все в жизни дальше путем.
Даже предлагаю считать всех участноков темы приятными культурными собеседниками.
Петухов и убогих не касается.
Разумеется, тебя считать приятным культурным собеседником никто не собирался, не переживай.
Хватит, иди проспись, завтра бурса ждет.