Отправить шестнадцатеричную команду на считыватель RFID R2000 - PullRequest
0 голосов
/ 25 октября 2019

В конфигурации модуля считывателя RFID R2000 я продвинулся в последнее время. Теперь у меня новый вопрос. Если я хочу получить информацию о настройке антенны, я посылаю команду Hex, и модуль возвращает следующую информацию: A5 5A 00 0A 2b 22 11 12 0D 0A, где данные 22 11 - DByte1 DByte0 и означает, что антенна 1,5, 10 и 14 выбраны. Я не знаю, как получить эту информацию из 22 11 шестнадцатеричного кода.

DByte1 (Hex 22) означает, что антенны 10 и 14 выбраны, DByte0 (Hex 11) означает, что антенны 1 и 5 выбраны

Как я могу получить 10,14 значения из Hex 11 и 1,5 значения из Hex 22 в Ruby? Как я могу сделать обратное действие, если я установил антенну 14 с Hex 20?

Заранее спасибо

1 Ответ

0 голосов
/ 25 октября 2019

Это простой двоичный формат. 0x2211 - это 16-разрядное целое число, где каждый бит представляет антенну:

format('%016b', 0x2211)
#=> "0010001000010001"
#      ^   ^    ^   ^
#     14  10    5   1

Таким образом, чтобы выяснить, установлена ​​ли антенна, вам просто нужно проверить, установлен ли соответствующий бит на 1:

n = 0x2211
n[0] == 1 #=> true
n[1] == 1 #=> false
n[2] == 1 #=> false
n[3] == 1 #=> false
n[4] == 1 #=> true

Обратите внимание, что индексы основаны на 0, т. Е. n[0] - это антенна 1.

Как получить значения 10,14 из шестнадцатеричных 11 и 1,5 значений из Hex 22 в Ruby?

Вы можете извлечь двоичный файл digits, объединить each цифру с индексом на основе 1 (with_index), select те биты, которые установлены на 1 и извлекают их индексы с помощью map:

0x2211.digits(2)                 #=> [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1]
      .each.with_index(1)        #=> [[1, 1], [0, 2], [0, 3], [0, 4], [1, 5], [0, 6], [0, 7], [0, 8], [0, 9], [1, 10], [0, 11], [0, 12], [0, 13], [1, 14]]
      .select { |b, i| b == 1 }  #=> [[1, 1], [1, 5], [1, 10], [1, 14]]
      .map(&:last)               #=> [1, 5, 10, 14]

Или с использованием битовых операторов & и <<:

antennas = []
0.upto(15) { |i| antennas.push(i + 1) if (0x2211 & (1 << i)) != 0 }
antennas #=> [1, 5, 10, 14]
...