serielle Schnittstelle nur einmal auslesen

  • Hallo zusammen,


    Ich hatte mal wieder lust zum basteln mit mein RFID Modul und den Raspi B2.

    Nun habe ich ein Problem: Wenn an dem RFID Lesegerät der Token zu lange vorgehalten wird aus was für ein Grund auch immer wird meine schleife x mal ausgeführt.

    Wie kann man eine Schleife bei irgendeiner Aktivität nur 1x ausführen lassen und dann wieder von vorne?

    So das die serielle Schnittstelle nur 1x immer abgefragt wird.

    Ich habe es auch schon mit time.sleep() versucht aber auch ohne erfolg.


    Danke im vorraus


  • Prinzipiell ist eine Zeitsperre nicht falsch. Die Frage ist nur, wie lange die sein soll.

    wenn du 3 Sekunden eingibst, wird bei vorgehaltener Karte deine Funktion eben alle 3 Sekunden ausgeführt.
    Wenn du 3 Tage eingibst, ist es vielleicht etwas viel, denn dann kannst du z. B. dein Garagentor nur alle drei Tage mit der Karte öffnen...

    Ich nehme an, dass es grundsätzlich ja möglich sein muss, die Funktion mehrfach nacheinander in bestimmten Abständen aufzurufen. Oder soll die Karte erst wieder akzeptiert werden, nachdem eine andere Karte gelesen wurde?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Das Problem ist wenn jetzt eine karte davor gehalten wird, werden die befehle x mal hintereinander abgearbeitet.Das soll natürlich nicht so sein, es muss so sein das nach dem eine karte davor gehalten wurde 3 sek. gewartet werden muss und dann von vorne wieder angefangen wird, oder eben eine andere karte davor gehalten wird.

    Von Zeile 27-36 wird bei der richtigen karte der Block x mal abgearbeitet ungewollt bei Kurzem vorhalten der karte als wenn der "Kontakt" ständig da wär.

    Wenn die falsche karte vorgehalten wird wird der andere block auch x mal abgearbeitet.

    Ich weiß einfach nicht wie ich ansetzen soll.

  • Du hast oben 3 Sekunden pause und weiter unten nochmal 5 - sind zusammen 8.

    Wartet er denn jeweils 8 Sekunden und läuft dann wieder durch die Schleife, ob wohl die Karte längst weg ist oder läuft er mehrfach innerhalb kürzseter Zeit durch die Schleifen?

    In 20-25 liest du 12 Bytes von der Chipkarte, wenn ich das richtig sehe.
    Bei jedem Byte gibst du den ASCII-Code aus (print) und löschst dann das LCD und schreibst "Chip bitte".

    Die letzten beiden Zeilen (24, 25) gehören eigentlich nicht in die Schleife und müssten eine Ebene ausgerückt werden.

    time.sleep(3) sollte vielleicht besser hinter print ID stehen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Er wartet dann ungefähr 8 sek und fährt die schleife weiter obwohl die karte längst "gelesen wurde" und nicht mehr da ist.

    Ich kann mir vorstellen das er wahrscheinlich mehr Impulse bekommt warum auch immer, ich steh da echt auf dem schlauch.

  • Deine Sleeps stehen zu weit vorne im Code - er wartet erst und gibt dann den Text aus.
    Er sollte erst die Ausgabe machen und dann warten.
    Ich nehme an, er macht die Schleife dann nur noch einmal, obwohl die Karte schon weg ist, aber nicht noch mehrmals, oder?


    time.sleep(3) sollte hinter print ID stehen.

    time.sleep(5) sollte hinterGPIO.output(23,False) stehen


    Probier das mal.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo Gnom,

    (bei falscher karte)

    Zeile 36-45 wird 6x hinter einander Ausgeführt wenn die karte vorgehalten wird.Die schleife läuft noch 6x mal "nach" obwohl die karte schon weg ist da liegt das problem.

    Normale weise werden die schleifen doch nur 1x ausgeführt.

  • Rätselhaft...

    Gibt er bauch bei allen Durchläufen die gleiche ID aus? Die wird definitiv am Schleifenanfang gelöscht... dann muss er neue Daten vom Lesegerät bekommen.

    Kannst du mal testen, ob das Lesegerät vielleicht mehrere Lesevorgänge im Puffer hat und diese dann noch hinterher schickt?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • So ich test weise mal den Code:

    Code
    import serial
    import time
    ser = serial.Serial('/dev/ttyAMA0',9600),
    
    while True:
     daten = ser.read(12)
     print daten    
     time.sleep(2)

    Da erhalte ich mehre verschiedene IDs ??? ich bin mit mein latain am ende.

  • Moin!


    Ich gehe davon aus, das der Tag nicht sofort wieder benutzt wird. Wenn ja, das eine "lange" Zeit vergangen ist!


    Folgender Vorschlag.


    Du erstellt einen Vergleich-Tag. Am Anfang hat er nur Nullen als Inhalt.

    Man liest den Tag ein und vergleicht ihn mit dem Vergleich-Tag.. Ist er ungleich, OK.

    Dann den gelesenen Tag in das Vergleich-Tag kopieren.

    Beim erneuten Lesen, ist der Tag gleich Vergleich-Tag. Verwerfen


    Für die "lange" Zeit.

    Ich weiß nicht ob es bei Python die Funktion Millis gibt. Man kann sicherlich auch den Zeitstempel nutzen.

    Nach der letzten Messung die Zeit speichern. Nach x Minuten den gespeicherten Wert auf Null setzen. Dann kann der Tag auch wieder eine Aktion auslösen.

    Also Tag-Id und Zeit in einem array, oder wie auch immer das bei Python heißt, speichern. Dann bei jedem 10ten Schleifendurchlauf testen.


    Sind alles nur Denkanstöße.....


    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Vielleicht trifft man sich in der RPi-Plauderecke.

    Edited 2 times, last by Bernd666: Büschen was dazu geschrieben. ().

  • Wäre es nicht das einfachste, wenn man nach dem Erkennen der Karte ein paar Sekunden wartet und dann den Puffer ausliest, bis er leer ist und die Daten einfach verwirft? Bei den üblichen Anwendungen wird ja selten innerhalb von 3 Sekunden der nächste Kandidat am Gerät sein...

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Guten Abend zusammen,

    habs jetzt einigermaßen hinbekommen.

    Jetzt noch eine Sache wie kann ich erzwingen das man erst nach z.B 4 sek wieder scannen kann?

    und mehre Tags (Tag1,Tag2 etc..) vergleichen kann.