input buffer flushen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Tag liebes Forum,

    Ich suche nach einer Möglichkeit einen input buffer zu flushen.
    Bei meinem Programm wird ein Anruf abgefragt und ausgewertet. Allerdings speichert er irgendwie diesen Input an einer stelle, wo dies eigentlich nicht möglich sein soll, da ich garkeinen Input Abfrage. Ich hatte nun überlegt, einfach bevor das Programm startet den input Buffer zu löschen.

    Habe dieses Programm dazu gefunden:

    Code
    def flush_input():
        try:
            import msvcrt
            while msvcrt.kbhit():
                msvcrt.getch()
        except ImportError:
            import sys, termios
            termios.tcflush(sys.stdin, termios.TCIOFLUSH)

    Ich verstehe es allerdings nicht, und weiss nicht wie dies genau funktioniert, was es macht und wo ich die Funktion einbauen muss, damit dies funktioniert.


    Vielen Dank:helpnew::danke_ATDE:,

    euer doggy

  • Hallo Doggy,

    meinst Du sowas?

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (8. Oktober 2017 um 19:07)

  • Code
    def flush_input():
        try:
            import msvcrt
            while msvcrt.kbhit():
                msvcrt.getch()
        except ImportError:
            import sys, termios
            termios.tcflush(sys.stdin, termios.TCIOFLUSH)

    *hust* Wieso willst du eine Anweisungen für Windows auf dem PI ausführen? :-/


    Was fürn Buffer überhaupt? Seriel? stdin? stdout?

    Such mal mit deiner Suchmaschine nach " python flush "
    (mit google zB 1.treffer)

  • Guten Tag,

    Ich meine, dass obwohl ich im Programm die input Abfrage noch nicht erreicht habe, ich einen einen input habe.

    Code
    while True:
        while GPIO.input == True:
            a = input("Irgendwas")

    Dieser Code einmal als Beispiel genommen. Zunächst bin ich in einer Endlosschleife, bis ein Eingang geschaltet wird. Gebe ich aber nun in der console eine Zahl ein passiert noch nichts, da ja kein input eigentlich gefragt wird. Schalte ich nachdem eingeben der Zahl den Eingang, schreibt er einfach diese Zahl in a und fragt garnichtmehr nach einem input. Das will ich verhindern.

    Das Ganze soll halt eine Fehlfunktion vermeiden. Wenn nun jemand einfach an der Tastatur rumgespielt hat, würde die nächste Person die sich anmelden will, direkt eine Fehleingabe zugewiesen bekommen. Ebenfalls habe ich dadurch Probleme mit dem Anrufprogramm, welches die Nummer bei erneuter Auswahl direkt wieder aus der Liste löscht, in die ich sie zuvor geschrieben habe, da sie irgendwo zwischengespeichert ist.

    Achja, es ist die selbe Baustelle. Nun allerdings mit zusätzlicher Telefon Erkennung. Man kann sich mit einem PIN oder einem Anruf anmelden. Habe dazu einen UMTS-Stick verwendet und die GSM Funktion darauf freigeschaltet.

    Ich glaube wenn ich fertig bin, stelle ich das gesamte Programm mal vor :) Villeicht findet der ein oder andere was nützliches darin für sich.


    Vielen Dank,

    euer doggy

    Einmal editiert, zuletzt von doggy (25. September 2014 um 13:41)

  • Dies ist das Script. In der Funktion Auswahl() geschieht der eigentliche input. Und genau dort, habe ich auch das Problem mit dem Anruf. Beim ersten anlauf funktioniert alles. Will nun aber der nächste Anrufen, wird einfach wieder die Nummer des vorgängers in number geschrieben und derjenige der nun die Funktion Anrufen gewählt hat, kann nichts tun.

    Einmal editiert, zuletzt von doggy (25. September 2014 um 13:44)

  • Hm ich seh da einige Fehler die allerdings nichts mit dem aktuellen Problem zu tun haben... Ein paar Einrückungsfehler die Python aber nicht verzeiht und der entsprechende Teil dann nicht geht.. Auch sind ein paar Sachen unglücklich gelöst oder es fehlen Checks um sicherzustellen das zB das öffnen der Seriellen Schnittstelle überhaupt funktioniert hat (in der Anweisung Anruf() sind die meisten Einrückungsfehler, aber auch in Beschaltung(listpin) sind einige (Wiederholungsfehler, der gleiche krams 6x wiederholt, das is etwas unglücklich gelöst)...)


    Du fragst also eine Eingabe von der Konsole ab und diese möchtest du vorher flushen. Dann probier das:

    Code
    sys.stdin.flush()

    ..vorher musst du aber natürlich import sys noch ausführen..

  • Ich danke dir vielmals.

    Ja, ich weiß das dieses Programm, leider nicht besonders professionell ist.
    Ich versuche deine Tipps umzusetzen, so gut es mir gelingt.

    Ich habe auch erst vor ca. 1 1/2 Monaten angefangen Programmieren zu lernen, im Rahmen meines Technikerprojektes als Elektrotechniker. Zuvor hatte ich gerade mal minimale C# Basic Kenntnisse.

    Mein größtes Problem ist ganz klar, dass ich noch keine flüssige Objektorientierte Programmierung beherrsche. Dadurch entsteht leider dieser Spagetthicode.

    Aber zunächst bin ich erstmal froh, wenn ich in 2 Monaten eine Funktion erreicht habe. :) Die Schönheit kann ich dann noch optional, wenn die Zeit vorhanden ist verbessern.

    Und zu deinem Befehl, ich probiere es mit Freuden aus und gebe später Bescheid, ob es funktioniert hat.

    liebe Grüße,

    doggy

    Einmal editiert, zuletzt von doggy (25. September 2014 um 14:05)

  • Spagetticode ist nicht das Problem ;)
    Nur mag Python es nicht wenn man falsche Einrückungen verwendet - da is Python ziemlich pingelig und macht dann nicht das was es soll. Als Grundregel sei gesagt: nicht Leerzeichen und Tabs mischen, bleib bei einem von beidem.

  • Ich habe nun

    Code
    sys.stdin.flush()

    verwendet. Allerdings brachte auch dies nicht den gewünschten Erfolg. Eine vor der eigentlichen Input Abfrage betätigte Eingabe, wird immer noch sofort in den Input geschrieben.

    Um Das Problem nochmals zu verdeutlichen, hier ein kleines Beispielprogramm.

    Python
    from time import sleep
    
    
    while True:
    
        sleep(5)
        a = raw_input("Nummer")
        print(a)


    Gebe ich nun in den 5 Sekunden sleep Zeit etwas ein, wird es einfach direkt nach dem Ablauf der sleep Zeit in den Input geschrieben, obwohl dieser noch garnicht abgefragt werden sollte. Eine Benutzereingabe ist dann nicht mehr Möglich am gewünschten Zeitpunkt

    Einmal editiert, zuletzt von doggy (26. September 2014 um 12:44)

  • Hallo Doggy,

    und so?

    Python
    from time import sleep
    
    
    while True:
    
        sleep(5)
        sys.stdin.flush()
        a = raw_input("Nummer")
        print(a)

    Ich bin mir sicher, dass das jeder hier so angeregt hat...


    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (26. September 2014 um 12:49)

  • Also ich hab mir aus deinem Script mal nur das raus kopiert was für "input" wichtig ist, aber kann dein Problem nicht reproduzieren!

    Ausführung:

    sieht doch gut aus?

  • Ja, bei der PIN Eingabe in diesem Programm fehlt auch noch der zusätzliche RFID Chip, die Pineingabe würde bei mir solange in einer While True Schleife laufen, bis der RFID Chip ausgelöst hat und die PIN Eingabe freigibt.

    Aber im Anruf Teil, ist das Problem auch in diesem Script^^

    Versuch mal mein Beispielprogramm und geb einfach bevor der Input erfragt wird etwas ein und warte ab. Dann verstehst du was ich meine

  • Hallo Doggy,

    was ist mit meinem Programmvorschlag? Funktioniert das?

    Zitat

    Ja, bei der PIN Eingabe in diesem Programm fehlt auch noch der zusätzliche RFID Chip, die Pineingabe würde bei mir solange in einer While True Schleife laufen, bis der RFID Chip ausgelöst hat und die PIN Eingabe freigibt.

    Das ist wohl der entscheidende Denkfehler. Erst muss der RFID-Chip auslösen BEVOR der Pin eingegeben werden kann.

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Versuch mal mein Beispielprogramm und geb einfach bevor der Input erfragt wird etwas ein und warte ab. Dann verstehst du was ich meine

    Hm ja

    Python
    from time import sleep
    import sys
    
    
    while True:
        print("..while..")
        sleep(5)
        sys.stdin.flush()
        a = raw_input("Nummer ")
        print(a)

    Ausführung:

    Code
    ..while..
    ja
    Nummer ja
    ..while..
    mmhNummer komisch
    mmhkomisch
    ..while..
    blubNummer ber
    blubber
    ..while..

    :s :denker:

  • Nun das Problem liegt bei Anruf() und Pin() vor. Es liegt einfach daran, dass er irgendwo etwas abspeicher. Ich vermute im Input Buffer. Beim Anruf, kriegt er jedes mal bei einem RING die Nummer. Der erste Ring, soll ja auch genutzt werden. Ringt das Handy nun ein zweites mal, speichert er sich das dennoch ab. Will ich nun also im Zweiten Zyklus wieder Anrufen wählen, nimmt er einfach wieder diesselbe Nummer anstatt einen neuen anruf abzuwarten.

    Bei der PIN eingabe, soll wie gesagt solange bis ein RFID Chip den Input freigibt gewartet werden(Wie gesagt der RFID Chip ist noch nicht drin, aber das ist erstmal egal. Das Beispielprogramm zeigt den Fehler ja gut genug auf^^). Gebe ich aber einfach vorher schon einen PIN ein und betätige dann den RFID Chip, fragt er keinen Input mehr ab sondern nutzt einfach, dass was vorher eingegeben wurde.

    Ich vermute halt, dass beide Probleme auf den selben Ursprung zurück zu führen sind.

    Einmal editiert, zuletzt von doggy (26. September 2014 um 13:08)

    • Offizieller Beitrag

    Ich bin jetzt komplett verwirrt. Ich habe wirklich versucht den Ablauf des Programms zu verstehen...aber ich krieg Kopfschmerzen ;). Da sind ja soviel baustellen...Für was ist speicher gut? und warum stehen da nur 0'en drin. speicher wird auch nie irgendwie befüllt. Es wird aber verglichen ob in speicher der Pin drinne ist. Der ganze elif GPIO.input(KBesetztx) Teil schreit nach einer Funktion die das für einen erledigt. 6x mal der annähernd gleiche Quelltext ist ein gutes Indiz dafür.

    Schnapp dir einen python debugger und vollziehe nach was mit den Variablen wann passiert.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!