Hallo zusammen,
ich habe einen RDM630 an meinem Raspberry Pi laufen und gleiche tags mit einer Mysql Datenbank ab, um entsprechende Informationen dann per Php darzustellen.
Funktioniert auch alles so wie ich das möchte nur hab ich einen Fehlerteufel im Python Code.
Vorweg ich bin kein Profi also verzeiht mir meinen unaufgeräumten und vielleicht unlogischen Code
Zum Problem: Angenommen ich Scanne karte1 und karte2 nacheinander, dann bekomme ich meistens karte1 2 mal. Erst nach mehrfach Aktivierung des Interrupts wird mir die uid von karte2 ausgegeben. Der Fehler ist reproduzierbar aber nicht zuverlässig. Es kann sein karte1 wird 2 mal oder öfter ausgegeben. Auch die korrekte Funktion ist ab und zu vorhanden. Aber eben nicht dauerhaft.
Es scheint als ob die uid von karte1 irgendwo zwischengespeichert bleibt. Hatte zuerst den zweiten thread im Verdacht. aber auch ohne Ansteuerung der LED bleibt der Fehler.
import RPi.GPIO as GPIO
import time
import serial
import MySQLdb
import sys
import os
from thread import start_new_thread
GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
UART = serial.Serial("/dev/ttyAMA0", 9600)
UART.open()
success = 0
def cls():
os.system(['clear', 'cls'][os.name == 'nt'])
cls()
def mysqlex(sqlquery):
global success
db = MySQLdb.connect(host="localhost", user="xxx", passwd="xxx", db="xxx")
cur = db.cursor()
try:
cur.execute(sqlquery)
db.commit()
success = cur.fetchone()
print success
except:
db.rollback()
success = None
print "no success"
cur.close()
db.close()
def led():
GPIO.setup(18, GPIO.OUT)
GPIO.setwarnings(False)
GPIO.output(18, False)
time.sleep(3)
GPIO.output(18, True)
def interrupt(channel):
start = "\x02"
ende = "\x03"
while True:
ID = ""
state = UART.read()
if state == start:
for Counter in range(13):
zeichen = UART.read()
ID += str(zeichen)
# UART.flushInput()
ID = ID.replace(start, "")
ID = ID.replace(ende, "")
print "ID -->", ID
rfid = int(ID, 16)
print "+********************************+"
print rfid
sql = "SELECT * FROM Rfid WHERE rfid_key = ('%s')" % rfid
mysqlex(sql)
if success is not None:
start_new_thread(led, ())
print "Zugang erlaubt +"
print "+********************************+"
print " "
return
else:
print "Zugang verweigert +"
print "+********************************+"
print " "
return
GPIO.add_event_detect(24, GPIO.RISING, callback=interrupt, bouncetime=3000)
def main():
while True:
time.sleep(1)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
sys.exit()
finally:
GPIO.cleanup()
Alles anzeigen
Anmerkung zum Screenshot:
Abfolge der gescannten Karten war.
karte1 (0E002271F3AE)
karte2 (6B007D28C0FE)
karte2
karte2
karte2
3 Falsche Ergebnisse bevor die richtige uid ausgegeben wird.
Danke