向R2000 RFID读取器发送十六进制命令



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

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

如何在Ruby中从Hex 11获得10,14值,从Hex 22获得1,5值?如果我用Hex 20设置了天线14,我该如何做相反的操作?

提前感谢

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

最新更新