Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Компьютерное железо
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2011, 21:01   #1
AngelBOY
 
Регистрация: 26.04.2007
Сообщений: 3
Вопрос Сравнение чисел в двоичной системе по маске

Приветствую всех!

Захотелось мне тут написать программу для работы с автомобильным блоком ("автоподсос" для карбюратора), который работает через COM.
Пообщался я с разработчиком сего девайса, и объяснил он мне протокол.
Но на одном из моментов возникла у меня проблема и полное непонимание.

В общем суть такова:
Блок передаёт данные в HEX, при расшифровке я получаю строку в которой есть параметр: 07
И вот тут начинается.
Оказывается нужно перевести это число в двоичную систему, и через какое-то сравнение (я так и не понял какое) определить какие провода подключены (в данном параметре "зашифрованы" эти данные).
Пример мне разработчик дал вот какие:
Код:
if (out_bits & 0b00000001) koncevik=1;
if (out_bits & 0b00000100) ebn=1;
Вариант из его программы на AutoIt:
Код:
$koncevik = BitShift ( BitAND($array[8], BitShift ( 1, -0 )),0)
Что здесь и как происходит?
Что вообще нужно сделать?
Я вообще не пойму ничего.

Всем спасибо за внимание, и надеюсь на понимание

Последний раз редактировалось AngelBOY; 04.12.2011 в 22:24.
AngelBOY вне форума Ответить с цитированием
Старый 05.12.2011, 00:03   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> нужно перевести это число в двоичную систему

не нужно, числа и так в двоичной системе хранятся.

> Что здесь и как происходит?

Код:
var
  koncevik, ebn: Boolean;

....

koncevik := 0 <> (out_bits and $1);
ebn := 0 <> (out_bits and $4);
> Что вообще нужно сделать?

освоить двоичную систему исчисления и битовые операции. Этого должно хватить.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.12.2011, 00:32   #3
AngelBOY
 
Регистрация: 26.04.2007
Сообщений: 3
По умолчанию

Спасибо огромное за код, относительно масок мне тоже уже немного объяснили.

Цитата:
освоить двоичную систему исчисления и битовые операции. Этого должно хватить.
Не будит случайно ссылки на материал в нормальном изложении - так сказать для гуманитария?

-----

И кстати, код в таком виде будит нормально работать?
Код:
BoolToStr(0 <> (StrToInt(out_bits) and $0)) //koncevik
BoolToStr(0 <> (StrToInt(out_bits) and $2)) //ebn
BoolToStr(0 <> (StrToInt(out_bits) and $3)) //start
BoolToStr(0 <> (StrToInt(out_bits) and $4)) //temp
BoolToStr(0 <> (StrToInt(out_bits) and $6)) //lampa
Или строку (out_bits) всё-таки нужно приводить к какому-то другому типу (cardinal и т.д.)?

И каким образом сей код можно проверить?
Просто не охота блок носить к машине и проверять.

Последний раз редактировалось AngelBOY; 05.12.2011 в 01:02. Причина: Добавил вопрос
AngelBOY вне форума Ответить с цитированием
Старый 05.12.2011, 02:10   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Википедии должно хватить, это совсем базовые понятия.

> строку (out_bits) всё-таки нужно приводить к какому-то другому типу

не зная, что у вас в строке хранится, трудно что-то ответить. Если в строке число не превышающее диапазон Integer, то StrToInt() должно хватить. Но, судя по С-шному коду из первого сообщения, там просто поток бит.

BoolToStr() вобще не понятно зачем, чтобы на экране показывать?

> StrToInt(out_bits) and $2)) //ebn

ebn вроде в третьем бите было ($4), почему тут $2?

> каким образом сей код можно проверить?

Я бы советовал сделать так:

1) считать реальные байты из СОМ порта. Ну или пусть разработчик даст вам набор байт, которые вы получите от девайса на основе его протокола.

2) Записать эти данные в файл.

3) Работать с данными из файла так, как будто вы их только что получили из СОМ порта.

4) Проверить, что ваша прога выдаёт то, что ожидаось.

5) Проверить то же самое с реальными данными, полученными в этот раз из СОМ.

Иначе проще машину пригнать к вашему компу, меньше беготни будет )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.12.2011, 03:19   #5
AngelBOY
 
Регистрация: 26.04.2007
Сообщений: 3
По умолчанию

Цитата:
Википедии должно хватить, это совсем базовые понятия.
Премного благодарен, буду вникать.

Цитата:
не зная, что у вас в строке хранится, трудно что-то ответить. Если в строке число не превышающее диапазон Integer, то StrToInt() должно хватить. Но, судя по С-шному коду из первого сообщения, там просто поток бит.
Данные хранятся в string, а принимаются через "непостоянный" поток char
(компонент выдаёт не сразу весь пакет, а "по чуть-чуть").
Хотя можно и потоком бит (bin) принимать, но всё-равно потом в string переносить.

Цитата:
BoolToStr() вобще не понятно зачем, чтобы на экране показывать?
Да, именно.
А точнее для передачи дальше данных программе на вывод данных из потока.

Цитата:
ebn вроде в третьем бите было ($4), почему тут $2?
Да, кажется Вы правы.
Но дело собственно вот в чём, мне автор написал:
Цитата:
out_bits - состояние выходов:
0 - концевик
2 - EBN
3 - старт
4 - печка
6 - лампа подсоса
Вот собственно я и не пойму какая маска должна использоваться.
Автор писал что для нулевого байта маска - 1 (0b00000001), а для 2го - 4 (0b00000100).
Нужно будит уточнить относительно остальных наверно, ну или самому разобраться.

Цитата:
Я бы советовал сделать так:
Да здесь то собственно легко всё, именно с проверкой работы с блоком.
Блок при подключении к USB сам шлёт постоянно данные (каждую секунду).

Я хотел именно работу с этими битами проверить.
В любом случае большое спасибо за информацию и помощь.
AngelBOY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в двоичной системе незнайка_на_земле Помощь студентам 22 23.02.2011 08:15
вывод числа в двоичной системе jewels Общие вопросы C/C++ 12 11.03.2010 22:20
Сложение в двоичной системе счисления Volchara Общие вопросы C/C++ 2 23.04.2009 19:54
работа в двоичной системе Toten Помощь студентам 3 06.03.2009 16:35
Деление чисел в двоичной системе счисления Mss_Smith Помощь студентам 9 04.05.2007 17:02