将十六进制转换为 (RFID) 标签 ID
Convert Hex to (RFID) tag ID
我购买了简单的有源 RFID Reader,它使用 RS232 Shield 通过 RS232 串行端口连接到我的 Raspberry Pi 3。我想使用 reader 读取标签 ID。我写了一段代码,意思是从串口设备读取数据。当我 运行 它只是在等待什么,(没有错误信息)。如何使用此 reader 和 python 代码或 shell 脚本读取标签?
import serial
ser = serial.Serial ("/dev/ttyAMA0")
ser.baudrate = 9600
data = ser.read(8)
print (data)
更新
我能够使用以下方法读取标签:
ser = serial.Serial("/dev/ttyS0")
因为 ttyAMA0
是 Raspberry Pi 3 中的蓝牙(这仅适用于 python 3.4。当我尝试 python 2.7 时,字符串为空)。我的问题是我有一个标签,它的 ID 是 02160323,但是当我 运行 这段代码时,输出是:b'\xec
、b'\xfe
、b\xf6
、b\xfc
和类似的(不确定这些值是什么)。我如何识别实际ID?
更新 2
我能够将文本转换为 HEX,然后将其转换为数值。
import serial
ser = serial.Serial("dev/ttyS0", 9600)
data = ser.read()
hexo = data.encode('hex')
i = ord(data)
print(i)
print(hexo)
完整的ID是8个整数,给出的输出与卡上的ID关系不大。如何将其转换为显示 02160323?
更新 3
我的波特率一直不对,应该是115200
。现在我收到了价值:
4000021603237440 并且清晰可见我在其中有 ID。现在我必须检索编写适当算法的数据。有人可以帮我吗?
通过使用 7 个字节而不是 8 个字节解决了这个问题,然后每次 运行 它的十六进制值都是不可变的。如果您只想验证您的 ID,则忽略前 4 个字符串字符并选择剩余的 8 个字符。(Python 2.x)
import serial
while True:
ser = serial.Serial('/dev/ttyS0', 115200)
data = ser.read(7)
hexo = str(data.encode('hex'))
tagID = hexo[4:]
tagID = tagID[:8]
print(tagID)
关于您的更新编号 3。我最近不得不为 RFID reader 做一些类似的事情,整个包裹有一堆不同的信息(reader 范围内的标签数量,可以到达特定标签的天线数量,与状态相关的信息,IDD等等。
但是,每个扫描仪得到的序列不同。第一步是在文档中确定该顺序。一旦您知道了这一点,我强烈建议您使用 hexlify 库来获取 return 信号的十六进制表示。使用十进制进行字节读取和配置确实不方便
举例说明我的 reader 在读取标签时发送的内容:
字节 1:STX
字节 2:MSB 长度
字节 3:LSB 长度
字节 4:COM-ADR
字节 5:0xB0(帮助您锁定内容的常量)
字节 6 到 n-2:请求的数据
字节n-1到n:CRC校验值
您感兴趣的内容位于字节 6 到 n-2 的范围内(我并不是说您的扫描仪 return 类似,但它给了您一个想法)。此外,RFID IDD 始终最好以十六进制值表示!
我购买了简单的有源 RFID Reader,它使用 RS232 Shield 通过 RS232 串行端口连接到我的 Raspberry Pi 3。我想使用 reader 读取标签 ID。我写了一段代码,意思是从串口设备读取数据。当我 运行 它只是在等待什么,(没有错误信息)。如何使用此 reader 和 python 代码或 shell 脚本读取标签?
import serial
ser = serial.Serial ("/dev/ttyAMA0")
ser.baudrate = 9600
data = ser.read(8)
print (data)
更新
我能够使用以下方法读取标签:
ser = serial.Serial("/dev/ttyS0")
因为 ttyAMA0
是 Raspberry Pi 3 中的蓝牙(这仅适用于 python 3.4。当我尝试 python 2.7 时,字符串为空)。我的问题是我有一个标签,它的 ID 是 02160323,但是当我 运行 这段代码时,输出是:b'\xec
、b'\xfe
、b\xf6
、b\xfc
和类似的(不确定这些值是什么)。我如何识别实际ID?
更新 2
我能够将文本转换为 HEX,然后将其转换为数值。
import serial
ser = serial.Serial("dev/ttyS0", 9600)
data = ser.read()
hexo = data.encode('hex')
i = ord(data)
print(i)
print(hexo)
完整的ID是8个整数,给出的输出与卡上的ID关系不大。如何将其转换为显示 02160323?
更新 3
我的波特率一直不对,应该是115200
。现在我收到了价值:
4000021603237440 并且清晰可见我在其中有 ID。现在我必须检索编写适当算法的数据。有人可以帮我吗?
通过使用 7 个字节而不是 8 个字节解决了这个问题,然后每次 运行 它的十六进制值都是不可变的。如果您只想验证您的 ID,则忽略前 4 个字符串字符并选择剩余的 8 个字符。(Python 2.x)
import serial
while True:
ser = serial.Serial('/dev/ttyS0', 115200)
data = ser.read(7)
hexo = str(data.encode('hex'))
tagID = hexo[4:]
tagID = tagID[:8]
print(tagID)
关于您的更新编号 3。我最近不得不为 RFID reader 做一些类似的事情,整个包裹有一堆不同的信息(reader 范围内的标签数量,可以到达特定标签的天线数量,与状态相关的信息,IDD等等。
但是,每个扫描仪得到的序列不同。第一步是在文档中确定该顺序。一旦您知道了这一点,我强烈建议您使用 hexlify 库来获取 return 信号的十六进制表示。使用十进制进行字节读取和配置确实不方便
举例说明我的 reader 在读取标签时发送的内容:
字节 1:STX 字节 2:MSB 长度 字节 3:LSB 长度 字节 4:COM-ADR 字节 5:0xB0(帮助您锁定内容的常量) 字节 6 到 n-2:请求的数据 字节n-1到n:CRC校验值
您感兴趣的内容位于字节 6 到 n-2 的范围内(我并不是说您的扫描仪 return 类似,但它给了您一个想法)。此外,RFID IDD 始终最好以十六进制值表示!