试着找出d区

2024-04-26 11:50:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为RFID-230-2读卡器编写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读取器读取数据,on必须将CMD设置为0x38,并将DATA设置如下: enter image description here

但是我还没有弄清楚如何创建这样的数据格式。 任何帮助都将不胜感激。这就是我迄今为止所做的

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. 您可以从反碰撞命令返回数据中获取卡序列号。但问题是,我怎样才能把那张卡系列不在旁边请求卡片参数来选择卡片呢? 卡系列号为4字节数据。我试过了但是

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)

Tags: cmddatalenaddressbytelengthstructcommand
1条回答
网友
1楼 · 发布于 2024-04-26 11:50:42

你的方法有几个问题。首先,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))

要传递更多的数据字节,请向列表中添加更多的数字。你知道吗

相关问题 更多 >