2016-08-05 7 views
0

У меня есть проект для моей работы школы, чтобы прочитать идентификационную карту RFID RDM6300 это мой кодContinous чтения ID RFID

import serial 

class Reader(object): 
"""The RFID reader class. Reads cards and returns their id""" 

def __init__(self, port_name, baudrate, string_length, timeout=1): 
    """Constructor 

    parameters: 
    port_name : the device name of the serial port 
    baudrate: baudrate to read at from the serial port 
    string_length: the length of the string to read 
    timeout: how to long to wait for data on the port 
    """ 
    self.port = serial.Serial(port_name, baudrate=baudrate, timeout=timeout) 
    self.string_length = string_length 

def read(self): 
    """Read from self.port""" 
    rcv = self.port.read(self.string_length) 

    if not rcv: 
     return None 

    try: 
     # note : data from the RFID reader is in HEX. We'll return 
     # as int. 
     tag = { "raw" : rcv, 
       "mfr" : int(rcv[1:5], 16), 
       "id" : int(rcv[5:11], 16), 
       "chk" : int(rcv[11:13], 16)} 

     print "READ CARD : %s" % tag['id'] 

     return Card(tag) 
    except: 
     return None 

class Card(object): 

def __init__(self, tag): 
    self.tag = tag 

def get_id(self): 
    """Return the id of the tag""" 
    return self.tag['id'] 

def get_mfr(self): 
    """Return the mfr of the tag""" 
    return self.tag['mfr'] 

def get_chk(self): 
    """Return the checksum of the tag""" 
    return self.tag['chk'] 


def __repr__(self): 
    return str(self.get_id()) 

def is_valid(self): 
    """Uses the checksum to validate the RFID tag""" 
    i2 = 0 
    checksum = 0 

    for i in range(0, 5): 
     i2 = 2 * i 
     checksum ^= int(self.tag.raw[i2 + 1:i2 + 3], 16) 

    return checksum == tag['chk'] 

, но результат в том, что она продолжает снова и снова читает тот же идентификатор

+0

Исправьте код вашего кода. –

+0

Да, спасибо за исправление –

+0

Исправлен только первый класс. –

ответ

0

Эта ветка действительно старая ... Я не знаю, поняли ли вы это или нет, но, возможно, следующий парень, который спотыкается об этом, найдет это полезным. Причина, по которой вы снова читаете карточку, заключается в том, что RDM6300 постоянно отправляет данные, пока карта находится в непосредственной близости от антенны. Задержек нет. Таким образом, ваш последовательный буфер заполняется, и ваша программа считывает из буфера одну запись за раз ... Идеально вы должны прочитать одну запись из последовательного буфера, а затем отбросить остальную часть, очистив буфер ... или, вероятно, лучше прочитать одну запись, разрешить время для любых действий, которые вы хотите предпринять на основе идентификатора карты, а затем очистить буфер, когда ваш код готов к другой записи ... или через реалистичное время между считыванием карт.