2016-11-09 7 views
0

私はRFID-230-2カードリーダー用のpythonドライバを書こうとしています。 ドキュメントは、デバイスと通信するために、一つは以下のフォーマットでパケットを作成しなければならない、と言うとおりにCMDを設定しなければならないブロックデータを見つけようとしています

|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リーダーからデータを読み取ることができるようにするために、上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を待っresp = ser.read()でプログラムを停止行っているものです。 誰かがintrestされている場合、これは完全な文書です。 http://www.tetagroup.net/products/pdf/rft230.pdf

################ EDIT 1

ドキュメントはRequest Card Parameter + Card Series No. を提供する必要がカードを読み取るために、あなたがカードを取得することができ、言うようにAnti Collideコマンドの系列番号はデータを返します。しかし、問題は、どのようにカードを選択するために側の要求カードのparamteresに沿ってそのカードシリーズを置くことができますか? カードシリーズは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) 
+0

'" \ x0A "'?どのように行/パケットの終わりを検出するには? – dsgdfg

答えて

1

。まず、BCC計算にデータバイトを含める必要があります。第2に、データバイトはどのコマンドが使用されているかによって異なります。たとえば、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

関連する問題