2016-08-05 50 views
0

Ich habe ein Projekt für meine Schularbeit, eine ID-Karte zu RFID RDM6300 diesKontinuierlich las 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'] 

mein Code zu lesen, aber das Ergebnis ist, dass es weiterhin genau die gleiche ID immer wieder lesen

+0

Bitte korrigieren Sie die Einrückung Ihres Codes. –

+0

Ja danke für die behoben –

+0

Nur die erste Klasse ist behoben. –

Antwort

0

Dieser Thread ist wirklich alt ... Ich weiß nicht, ob Sie das herausgefunden haben oder nicht, aber vielleicht wird der nächste Typ, der darüber stolpert, dies nützlich finden. Der Grund dafür, dass die Karte immer wieder gelesen wird, ist, dass der RDM6300 kontinuierlich Daten sendet, solange sich die Karte in der Nähe der Antenne befindet. Es gibt keine Verzögerungen. So füllt sich Ihr serieller Puffer und Ihr Programm liest einen Eintrag aus dem Puffer ... Idealerweise sollten Sie einen Eintrag aus dem seriellen Puffer lesen und dann den Rest löschen, indem Sie den Puffer löschen ... oder wahrscheinlich einen Eintrag besser lesen, lassen Sie Zeit für alle Aktionen, die Sie basierend auf der Karten-ID ausführen möchten, und löschen Sie dann den Puffer, wenn Ihr Code für einen anderen Eintrag bereit ist ... oder nach einer realistischen Zeitspanne zwischen den Kartenlesevorgängen.