首页 > 解决方案 > 向 R2000 RFID 阅读器发送十六进制命令

问题描述

在R2000 RFID阅读器模块的配置上,我在上次有所进步。现在我有一个新问题。如果我想获取天线设置信息,我发送一个十六进制命令,模块返回下一个信息:A5 5A 00 0A 2b 22 11 12 0D 0A 其中数据 22 11 是 DByte1 DByte0,表示天线 1、5、10 和 14 是选择。我不知道如何从 22 11 Hex 代码中获取此信息。

DByte1 (Hex 22) 表示选择天线 10 和 14 DByte0 (Hex 11) 表示选择天线 1 和 5

如何在 Ruby 中从 Hex 11 中获取 10,14 个值,从 Hex 22 中获取 1,5 个值?如果我将天线 14 设置为 Hex 20,我该如何进行反向操作?

提前致谢

标签: arraysrubybyte

解决方案


这是一种简单的二进制格式。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。

如何在 Ruby 中从 Hex 11 中获取 10,14 个值,从 Hex 22 中获取 1,5 个值?

您可以提取二进制digits,将eachdigit 与其基于 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]

推荐阅读