arrays - 向 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,我该如何进行反向操作?
提前致谢
解决方案
这是一种简单的二进制格式。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
digit 与其基于 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]
推荐阅读
- sql-server - 从 SQL Server 到 Excel 的不同日期时间格式
- batch-file - 如何使用 vbs 运行多个批处理并使用环境变量设置批处理文件路径?
- sql-server - 如何向 T_SQL 存储过程添加可选参数?
- javascript - React.js this2.setState 不是函数?
- r - div容器中的脚本
- node.js - 从基于文件夹的 npm 依赖项导入模块
- javascript - 如何在点列表中附加光滑的箭头?
- bash - 使用 AppleScript + bash 发送文件对象
- javascript - Highcharts:向面积折线图添加多种颜色
- mfc - 如何使用 pywinauto 自动将“.txt”文件从本地加载到 MFC 应用程序?