Преобразование типов
- Войдите на сайт для отправки комментариев
Пнд, 24/10/2016 - 18:43
Считываю с цифровых портов значения в массив символов Char[], далее нужно преобразовать массив в двоичное число. Будет ли работать правильно оператор преобразования типов Byte(Char[])?
Как правильно выполнить данное действие???
А что Вы понимаете под выражением "преобразовать массив в двоичное число"? Можете привести пример массива и какое число должно в итоге получиться?
Массив-строка: пишем состояние портов нолики, единицы (будет иметь вид например 101101) чтобы далее преобразовать в двоичное число, а уже из него с помощью имеющихся операторов преобразования типов - десятичное, результат = 45.
Перибираем строку по одному элементу с права на лево с помощью n. Если текущий символ =0 ничего не делаем. Если единица, то i|=1<<n;. Кончатся символы i будет содержать требуемое число.
И какова максимальная длина Вашего массива?
Будет ли работать правильно оператор преобразования типов Byte(Char[])?
Оператор ВСЕГДА будет работать правильно (случай аппаратной неисправности МК не рассматриваем).
Другое дело, сумеете ли Вы его правильно применить в своей программе.
Еще раз о задаче. Имеется 24 датчика, которые прикреплены на порты, там дискретные значения либо 0 либо 1. (Тренажер)
Задумка - это будет 24-разрядный двоичный код, если с первого по последний порт записать последовательно в строку состояние каждого. Далее этот двоичный код(строку) преобразовать в удобочитаемое число(расшифровка ответа). Вот я и задал вопрос, как правильно сделать преобразование. Может есть изящный способ без посредников(без лишних действий) получить результат.
Другое дело, сумеете ли Вы его правильно применить в своей программе.
Вот по этому поводу и прошу помощи знатоков!
IgorU, зачем вы вообще делаете массивы, строки? В одну переменную unsigned long уместятся все ваши 24 бита. Почитайте про битовые операции -это легко и удобно.
Я не знаю как сделать, поэтому одна из версий получить результат у меня такая как описал.
Вам вообще не нужен никакой массив и никакое преобразование. Записываете объединение (union), состоящее из длиного целого и 24-х битовых полей (см.). Складываете свои датчики в битовые поля, а в целом у Вас всегда находится готовое целое число. Ничего не надо никуда преобразовывать.
Для новичка сложновато... После объявления объединения из двух полей, как заполнить структуру? Это будет простое присвоение значений каждому байту в структуре? Обращаться к байтам для присвоения (по аналогии) также, как к элементам массива?
Без примера кода пустой звук... :)
про прямое обращение к портам почитайте http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
там и примеры есть
как заполнить структуру? Это будет простое присвоение значений каждому байту в структуре?
Биту, а не байту. Просто обращение по имени
Без примера кода пустой звук... :)
А что, по той ссылке, что я дал, мало примеров? Ну, если мало, теперь Вы знаете слова "union" и "битовые поля" - в гугле не забанили? Примеров в сети чуть ли не больше, чем порнухи.
Спасибо, конечно обращение к битам (оЧепятка). Примеров не мало, просто некоторые конструкции СИ не работают в среде Ардуино, ранее были попытки неудачные в применении "один к одному".... Возможно по неопытности... Буду разбираться.
К тому же, если в скетче оперировать непосредственно портами, то при переносе на другую платформу Ардуино, нужно будет переписывать под конкретный экземпляр, как то не комильфо!
Для новичка сложновато... После объявления объединения из двух полей, как заполнить структуру? Это будет простое присвоение значений каждому байту в структуре? Обращаться к байтам для присвоения (по аналогии) также, как к элементам массива?
Без примера кода пустой звук... :)
xDriver избавил от мытарств, Спасибо! Извилины встают на место. Когда знаешь как - оказывается все просто!
Вопрос: при объявлении структуры, обязательно указывать(заявлять) все 32 бита или достаточно моих 24?
Дополнит, нет типа из трех байт только 1,2,4.
просто некоторые конструкции СИ не работают в среде Ардуино
Все работают
К тому же, если в скетче оперировать непосредственно портами, то при переносе на другую платформу Ардуино, нужно будет переписывать под конкретный экземпляр, как то не комильфо!
А кто Вас просит? Описали битовое поле (как Вам коллега уже показал) и присавивайте ему результат digitalRead(), кто Вам не даёт?
Всё там нормально, просто не бойтесь и не выдумывайте несуществующих проблем.
Принято! Еще раз благодарю всех за разъяснения.
Дополнит, нет типа из трех байт только 1,2,4.
Утверждение ложно. AVR GCC поддерживает трехбайтные целые числа.
"Signed and unsigned 24-bit integers: __int24 (4.7), __uint24 (4.7)."
https://gcc.gnu.org/wiki/avr-gcc
AVR GCC поддерживает трехбайтные целые числа.
"Signed and unsigned 24-bit integers: __int24 (4.7), __uint24 (4.7)."
https://gcc.gnu.org/wiki/avr-gcc
Поддерживает то оно поддерживает, но не совсем.
Например, Serial.print() не знает, как отображать __int24.
И самое главное (и непонятное) - при замене в промежуточных вычислениях long на __int24 происходит не уменьшение, а увеличение как размера кода, так и количества команд.
Например, замена
int a = b*(long)c/d...
на
int a = b*(_int24)c/d...
приводит к увеличению объема прошивки на 20-30 байт.
При выводе значения в порт между переключениями потенциала на пинах разряда(переключение датчиков) отображает неверное значение, причем этих значений может быть любое количество от 1 и более, в каждый момент рразное. Переключаю последовательно 1,2,4,8,16,32,64 Скан с порта:
При перезагрузке ардуины и стабильном состоянии датчиков результат отображается правильный, а при переключении датчиков уже косяк!!! Помогите вылечить!
Незнаю какие у вас датчики, но подозреваю, что без подтяжки к нулю. Судя по выводу, после отключения датчика какое то время на ноге сохраняется заряд.
Пробовал с резисторами(1К-100К) и без них, результат тот же... Подключаюсь так:
Проще использовать
pinMode(..., INPUT_PULLUP);
А датчик вешать на землю. И резистор тогда не нужен будет.
Судя по всему, датчиками у Вас являются механические контакты, которые обладают способностью к дребезгу. Если это для Вас критично, то смотрите, например, тут http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki
Проще использовать pinMode(..., INPUT_PULLUP);
Повешал датчик на землю+INPUT_PULLUP = Этот вариант сработал корректно, даже быстрое переключение без ошибок. Спасибо. Может понадобится кому: https://www.arduino.cc/en/Tutorial/InputPullupSerial
Еще вопрос: Нужно сравнить начение D.value(см.выше в коде) с переменной типа Int - как правильно?
Еще вопрос: Нужно сравнить начение D.value(см.выше в коде) с переменной типа Int - как правильно?
Совсем правильно - никак потому что D.value беззнаковое, int - знаковое. А так - сравнивайте на здоровье, кто Вам не даёт int a = 23; if (D.value == a) ...
Млин, невнимательность... Разобрался, ошибки в синтаксисе