试图找出块数据
Trying to figure out block data
我正在尝试为 RFID-230-2 卡 reader 编写 python 驱动程序。
正如文档所说,为了与设备通信,必须按照以下格式制作一个数据包:
|STX|ADDR|LEN|CMD/STU|DATA|BCC|
STX: Communication start character, 1 byte, 0x02
ADDR: Device Addr, 1 byte, 0 can be used in any addr
LEN: Data length, 1 byte, data length of CMD/STU+DATA
CMD/STU: Command byte (Host->Reader) or Status byte (Reader->Host), 1byte
DATA: Data information, byte is not specified. Can be not existed
BCC: Section checking character, 1 byte, the XOR value of all the bytes except STX, BCC
为了能够从 rfid reader 读取数据,on 必须将 CMD
设置为 0x38
并设置 DATA
如下:
但我一直无法弄清楚如何创建这种数据格式。
任何帮助将不胜感激。这就是我到目前为止所做的
STX = 0x02
REQUEST_FORMAT = 'bbbbbb'
def communicate(self, command, data):
address = 0x0
length = 1 + len(str(data)) + len(str(command))
bcc = address ^ length ^ command
i = struct.pack(REQUEST_FORMAT, STX, address, length, command, data, bcc)
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write(i)
time.sleep(.1)
resp = ser.read()
程序停止在resp = ser.read()
等待响应。
如果有人感兴趣,这是完整的文档。
http://www.tetagroup.net/products/pdf/rft230.pdf
################ 编辑 1
如文档所述,要读取卡片,您必须提供 Request Card Parameter
+ Card Series No.
你可以从 Anti Collide 命令 return 数据中获取卡系列号。但问题是,我怎样才能把那张卡片系列没有旁边的请求卡片参数放到 select 卡片上?
卡系列号是4byte数据。我试过了但是
communicate(0x33, [0x93, 1487824920])
File "main.py", line 21, in communicate
i = struct.pack('BBBB%sBB' % len(data), STX, address, length, command, *(data + [bcc]))
struct.error: ubyte format requires 0 <= number <= 255
1487824920 是以下结果:
a = binascii.hexlify(data)
card_series = int(a, 16)
您的方法存在几个问题。首先,BCC 计算应包括数据字节。其次,数据字节取决于正在使用的命令,因此如果不存在,例如使用 get version 命令,则需要修改格式。我建议您的第一个命令应该是获取版本号。这将帮助您证明它工作正常:
import binascii
import struct
STX = 0x02
def as_bytes(number):
output = []
while number:
output.insert(0, number % 256)
number >>= 8
return output
def communicate(command, data=[]):
address = 0x0
length = 1 + len(data)
bcc = address ^ length ^ command
for b in data:
bcc ^= b
if len(data):
i = struct.pack('BBBB{}BB'.format(len(data)), STX, address, length, command, *(data + [bcc]))
else:
i = struct.pack('BBBBB'.format(len(data)), STX, address, length, command, bcc)
# Display the command to be sent in hex
print binascii.b2a_hex(i)
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write(i)
time.sleep(.1)
resp = ser.read()
print binascii.b2a_hex(resp) # display response
communicate(0x21) # Get version number
communicate(0x23, [0]) # Set baud rate of device to 9600
communicate(0x33, [0x93] + as_bytes(1487824920))
要传递更多数据字节,请向列表中添加更多数字。
我正在尝试为 RFID-230-2 卡 reader 编写 python 驱动程序。 正如文档所说,为了与设备通信,必须按照以下格式制作一个数据包:
|STX|ADDR|LEN|CMD/STU|DATA|BCC|
STX: Communication start character, 1 byte, 0x02
ADDR: Device Addr, 1 byte, 0 can be used in any addr
LEN: Data length, 1 byte, data length of CMD/STU+DATA
CMD/STU: Command byte (Host->Reader) or Status byte (Reader->Host), 1byte
DATA: Data information, byte is not specified. Can be not existed
BCC: Section checking character, 1 byte, the XOR value of all the bytes except STX, BCC
为了能够从 rfid reader 读取数据,on 必须将 CMD
设置为 0x38
并设置 DATA
如下:
但我一直无法弄清楚如何创建这种数据格式。 任何帮助将不胜感激。这就是我到目前为止所做的
STX = 0x02
REQUEST_FORMAT = 'bbbbbb'
def communicate(self, command, data):
address = 0x0
length = 1 + len(str(data)) + len(str(command))
bcc = address ^ length ^ command
i = struct.pack(REQUEST_FORMAT, STX, address, length, command, data, bcc)
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write(i)
time.sleep(.1)
resp = ser.read()
程序停止在resp = ser.read()
等待响应。
如果有人感兴趣,这是完整的文档。
http://www.tetagroup.net/products/pdf/rft230.pdf
如文档所述,要读取卡片,您必须提供 Request Card Parameter
+ Card Series No.
你可以从 Anti Collide 命令 return 数据中获取卡系列号。但问题是,我怎样才能把那张卡片系列没有旁边的请求卡片参数放到 select 卡片上?
卡系列号是4byte数据。我试过了但是
communicate(0x33, [0x93, 1487824920])
File "main.py", line 21, in communicate
i = struct.pack('BBBB%sBB' % len(data), STX, address, length, command, *(data + [bcc]))
struct.error: ubyte format requires 0 <= number <= 255
1487824920 是以下结果:
a = binascii.hexlify(data)
card_series = int(a, 16)
您的方法存在几个问题。首先,BCC 计算应包括数据字节。其次,数据字节取决于正在使用的命令,因此如果不存在,例如使用 get version 命令,则需要修改格式。我建议您的第一个命令应该是获取版本号。这将帮助您证明它工作正常:
import binascii
import struct
STX = 0x02
def as_bytes(number):
output = []
while number:
output.insert(0, number % 256)
number >>= 8
return output
def communicate(command, data=[]):
address = 0x0
length = 1 + len(data)
bcc = address ^ length ^ command
for b in data:
bcc ^= b
if len(data):
i = struct.pack('BBBB{}BB'.format(len(data)), STX, address, length, command, *(data + [bcc]))
else:
i = struct.pack('BBBBB'.format(len(data)), STX, address, length, command, bcc)
# Display the command to be sent in hex
print binascii.b2a_hex(i)
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write(i)
time.sleep(.1)
resp = ser.read()
print binascii.b2a_hex(resp) # display response
communicate(0x21) # Get version number
communicate(0x23, [0]) # Set baud rate of device to 9600
communicate(0x33, [0x93] + as_bytes(1487824920))
要传递更多数据字节,请向列表中添加更多数字。