Передача данных по i2c
- Войдите на сайт для отправки комментариев
Чт, 28/04/2016 - 15:03
Здравствуйте,
Нужно от слейва получить массив, например int data[2]. Если отправить его можно, как Wire.wright(data,sizeof(data)) то как его правильно принять на мастере?
Неправильно написал.
Ну, например, побайтово, функцией Wire.read в цикле по размеру массива. Именно размеру в байтах, а не длине в элементах.
Я не могу понять, как c помощью Wire.read() можно принять переменную int. В примерах используется либо char либо byte.
Её нужно разбивать на пакеты по 1 байту?
Ну, принимаете и складываете побайтово. Ну, вот, если у Вас массив из двух целых. как Вы написали. Хорошо, теперь опишите ещё указатель на byte, который смотрит на начало этого массива. Примерно так:
После этого Вы можете спокойно принимать быйты и складывать их в pData[0], pData[1] ,pData[2], pData[3]
А когда все четыре байта сложите, то спокойно пользуйтесь Вашим массиво data - в нём будет всё правильно.
Вообще-то, грамотнее было сделать union, но я не буду пудрить Вам мозги. Да и наш указатель pData можно не располагать в памяти, а сделать макросом, но опять же - мозги пудрить не буду.
Спасибо. Буду пробовать
А можете про union и макрос рассказать или ссылкой поделиться. Интересно узнать, как было бы грамотнее
Про union. Ссылка, пример:
Про макрос. Ссылка. Пример:
Можете запустить, попробовать.
Кстати, в обоих случайх, никакой лишней памяти в области данных мы не расходуем.
Union похож на струтуру. Спасибо огромное.
Могу ошибаться, но разве это указатель? Это же адрес, вроде, константа т.с. Указатель - это переменная, содержащая адрес. Не? :)
Union похож на струтуру. Спасибо огромное.
Юнион и есть структура, в которой переменные раполагаются начиная с одного адреса поверх друг друга.
Могу ошибаться, но разве это указатель? Это же адрес, вроде, константа т.с. Указатель - это переменная, содержащая адрес. Не? :)
Вы о чём? О макросе? Если о нём, то да, указатель. Посмотрите, какой у какой у него тип. Переменной нет, потому что это не переменная, а выражение, имеющее тип byte *. Разве результат выражения не может быть указателем? Да и константой указатель имеет право быть. В данном случае выражение будет вычислено на этапе компиляции, потому никакой нагрузки в код нон не вносит. Всё с ним в порядке.
Евгений, а с Вами есть какая нибудь прямая связь? У меня видимо будет много вопросов, на которые, возможно, вы можете дать ответы
Нет, но я здесь часто бываю
Могу ошибаться, но разве это указатель? Это же адрес, вроде, константа т.с. Указатель - это переменная, содержащая адрес. Не? :)
Вы о чём? О макросе? Если о нём, то да, указатель. Посмотрите, какой у какой у него тип. Переменной нет, потому что это не переменная, а выражение, имеющее тип byte *. Разве результат выражения не может быть указателем? Да и константой указатель имеет право быть. В данном случае выражение будет вычислено на этапе компиляции, потому никакой нагрузки в код нон не вносит. Всё с ним в порядке.
Гм... Тут уже моего С, очевидно, мало, чтобы разобраться в тонкостях терминологиив нём применяемой...
С точки зрения теории указатель и адрес - это разные вещи... Указатель сам обязан иметь адрес, ибо является субъектом данных, а полученный на этапе компиляции "указатель"/адрес есть константа.
С точки зрения теории указатель и адрес - это разные вещи... Указатель сам обязан иметь адрес, ибо является субъектом данных, а полученный на этапе компиляции "указатель"/адрес есть константа.
Эк, куда Вас занесло! Ну, разговор, как я понимаю чисто абстрактно-теоретический? Хорошо.
Я вообще-то, занимался языками (теорией) но специализировался на другом классе языков, поэтому как-то "зуб давать" за то, что я сейчас скажу я бы не стал. Если интересно. я могу поговорить с "язычниками". которые специализируются именно на этом классе языков, но я уверен. что смысла обсуждать такие тонкости на русском языке нет никакого потому, что официального перевода стандарта С++ на русский язык не существует в природе (а значит и чётко определённой официальной терминологии на русском языке нет). В оргигинале же стандарта есть очень много нюансов (типа "pointer value", "pointer type", "pointer constant" и т.п. ), которые на русский переводятся как положит Бог на душу переводчикам.
В стандарте нигде не сказано, что указатель обязан иметь адрес, но я готов это принять, если говорить об указателе, как о переменной типа "указатель на". Однако, стандарт предполагает наличие не только переменных, но и других объектов типа "указатель на", например, стандартом чётко определяется литерал nullptr, который, разумеется, никакого адреса не имеет. Вы имеете полное право сказать, что это не указатель, а лишь "значение, которое может быть преобразовано у типу "указатель на"", ради бога, я спорить не буду, соглашусь. Также я готов согласиться. что мои константы из примеров не указатели, а "значения, которые могут быть преобразованы ...", пожалуйста, я согласен. Спорить тут неочем, поскольку спор идёт о терминологии, которая нигде официально не утверждена (на русском языке). Бессмыслица полная.
И вообще, это разговор не для форума об Ардуино, а для бесеlы за пивом после долгого рабочего дня конференции по теории языков. Если хотите, я могу прислать Вам приглашение на ближайшёю такую конференцию (летом), а здесь давайте прекратим нашу "злостную флудерастию" :))))
И вообще, это разговор не для форума об Ардуино, а для бесеlы за пивом после долгого рабочего дня конференции по теории языков. Если хотите, я могу прислать Вам приглашение на ближайшёю такую конференцию (летом), а здесь давайте прекратим нашу "злостную флудерастию" :))))
Хорошо. Согласен.
Где будет конференция? :)
Переславль-Залесский, она ежегодно проходит.
Кстати, если интересно, то там же в ноябре ежегодно проходит "Суперкомпьютерный форум".
Переславль-Залесский, она ежегодно проходит.
Кстати, если интересно, то там же в ноябре ежегодно проходит "Суперкомпьютерный форум".
Вы же тут сделаете объявление предварительно, ближе к началу события?
Ну, сделаю, но регистрироваться можно хоть сейчас, например, чтобы поучаствовать в выдвижении номинантов на ежегодную премию. Она там очень демократична - никаких высоколобых дядек-жюри, выдвигать может любой, а потом голосуют все. Причём система голосование преференциальная.
Только не надо мне задавать вопросов "как Вы боретесь с теоремой Эрроу" - никак не боремся, это математическая теорема, чего с ней бороться? Да, идеальная, доведённая до совершенства и абсолюта демократия есть ни что иное, как диктатура - это математически доказанный факт и бороться тут не с чем.
Здравствуйте, у меня возникла проблема над которой я уже бьюсь несколько дней, и она заключается в том что мне надо с NodeNCU управлять ардуино, передавать много переменных которые я буду получать по Wifi но у меня никак не получается организовать передачу массивов между платами, простые сообщение типа "Hello Arduino" передаются запросто, а вот масив с переменными не хочет, вот примеры кодов:
Код для NodeMCU
Код для ардуино нано:
Ориентировался на статью по этой ссылке: https://voltiq.ru/nodemcu-v3-connecting-to-arduino-via-i2c/ схему подключение тоже от туда взял, на выходе получаю такие сообщения:
Т.е. Вы привели нам работающий код, по которому Вам помощь не нужна, а неработающий - по которому нужна помощь, решили оставить в секрете. Логичное решение.
В этом коде не работает передача массивов между платами и я не знаю как ее сделать.
у меня никак не получается организовать передачу массивов между платами, простые сообщение типа "Hello Arduino" передаются запросто
Вот код для NodeMCU который я хочу сделать:
А вот для ардуино:
Это полные коды в которых ничего не убрано
Вы не так заходите.
Напишите специальный короткий код, который только демонстрирует Вашу проблему. Он не будет более 10 строк. Там должна быть показана Ваша проблема и не должно быть ничего лишнего. Вот этот код опубликуйте и задайте по нему конкретные вопросы.
А то Вы первый раз выложили "хелло", которые по Вашим словам отлично работают. Теперь какие-то сотни строк, в которых чего только нет. Кто в этом разбираться будет? Вопрос нужно подготовить. Вот и подготовьте.
А нельзя Wire.endTransmission(); из стр.192 как бы несколько позже вызывать? строки 189 и 190 намекают на вашу неуверенность. JSON.... Вы вэб-дизайнер? Им обычно не везет в ардуине.
Хорошо, проблема состоит в том что я не могу организовать передачу массива переменных, переменные являются числами от единиц до тисяч. Передача осуществляется от мастера NodeMCU к слейву ардуино нано:
Пример кода NodeMCU
Уже лучше. Теперь сделайте следующее
1. перевставьте первый кусок как положено
2. выложите заодно, что они (эти куски кода) печатают в сериал.
Я пока доеду до дома, а там гляну.
byte data[4]={4000,
...однако
Не знаю можно ли позже вызвать ети строки, тут я действительно неуверен. А по поводу JSON нет я не веб дизайнер.
Вот что выдает ардуино:
а чего тогда 4000 в байт запихиваете? Такое тока вэбдизайнерам позволено ;) Впишите delay(100); после 12 строки. Ну и после 13 тоже для начала. Строку 15 вобще к чему вписали?
отсюда https://forum.arduino.cc/index.php?topic=556381.0 шоле вдохновение берете?
Нет, но похоже с одного сайта
С чтением принимаемой информации разобрался, проблема оказалась в чтении этой информации, а более конкретно в char, ардуина принимала информацию и выводила с помощью char (слова).
замена на byte помогла
Так проблема решена? Или ещё вопросы остались?
Еще вопросик, как правильно реализовать чтение значений которые пришли, то-есть, отправляется такой массив {40, 8, 1, 60}, на приемной стороне мы его принимаем как 408160 или как
40
8
1
60
как задать переменным эти значения или же как считывать только одно из них?
Ну, а как Вы сейчас считываете?
byte
c = Wire.read();
Вы присвоили пришедшее значение переменной с. Так и делайте с остальными значениями