2016-11-09 31 views
0

我想爲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讀取器的數據,對具有設置CMD0x38並設置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()等待RESP。 如果有人感興趣,這是完整的文檔。 http://www.tetagroup.net/products/pdf/rft230.pdf

################編輯1

的文件說,爲了讀你必須提供Request Card Parameter + Card Series No. 可以拿到卡一卡的來自Anti Collide命令的序列號返回數據。但問題是,我怎麼能把這張牌系列沒有一邊請求卡paramteres選擇卡? 卡片序列號是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) 
+0

'「\ x0A」'?如何檢測行/包結束? – dsgdfg

回答

1

有你的方法一對夫婦的問題。首先,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)) 

要傳遞更多數據字節,請在列表中添加更多數字。

+1

我已經添加了一個'as_bytes()'函數來將一個整數轉換成一個字節列表,它應該可以滿足您的需求。 –

+0

非常感謝 – Juggernaut