Python2 /Python 3; Adafruit 16-Kanal PCA9685 und rpi-rf

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@mollyman: dann schau Dir nochmal genau an, was Du da machst:

Code: Alles auswählen

def rf_modul():
    print (" start rf modul")
    _thread.start_new_thread(receive, ())
    receive()
mollyman
User
Beiträge: 27
Registriert: Samstag 24. Februar 2018, 12:10

Upps * sich schäm*

Verstanden

Aber bevor das doppelte receive kommt, kommt ein print, das wird aber auch nicht geschrieben.

Ich korrigiere es und probiere es erneut
mollyman
User
Beiträge: 27
Registriert: Samstag 24. Februar 2018, 12:10

Habe den 2. receive Aufruf entfernt. es hat aber nix verändert.

Mir ist aber aufgefallen, dass wenn cih das Fenster schließe dann der receive startet.

Code: Alles auswählen

GUI()
rf_modul()
die Reihenfolge ist wohl schuld daran.
ein Tausche der Reihenfolge bringt einen neuen Fehler, der aber darauf hindeutet, dass dass das receive arbeitet:

Code: Alles auswählen

signal.signal(signal.SIGINT, exithandler)
ValueError: Signal only works in main thread.
Daraus entnehme ich dass ich das receive Script nicht in einen Thread auslagern kann.
Die GUI kann ich aber auch nicht auslagern.
Jetzt bin ich ziemlich ratlos
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@mollyman: wie schon ganz am Anfang geschrieben: Signale sind nicht die richtige Methode um "Aufzuräumen".
mollyman
User
Beiträge: 27
Registriert: Samstag 24. Februar 2018, 12:10

Mist.

Ich habe keine Ahnung vom parsen .
Leider verstehe ich anhand der jeweiligen Doku weder wie das receive script funktioniert noch was Signal eigentlich wirklich darin macht.

Tja, dann muss ich mir was einfallen lassen.
Dann geht es nicht mit der 433 MHz Lösung.

Danke für eure Hilfe.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist Unfug. Natuerlich geht das. Nur eben nicht mit dem aufeinanderkloppen von Skripten, die du nicht verstehst, und die Dinge machen wie zB Kommandozeilen Argumente parsen oder Fehlerbehandlung durchzufuehren auf (in DEINEM FALL) ungeeignete Art und Weise.

Du brauchst weder eine flexible Angabe des verwandten GPIOs (womit der Argument-Parser rausfaellt), noch willst du dein Skript per Ctrl-C abbrechen und danach schoen aufraeumen. Womit die Signal-Behandlung entfaellt.

Alles was du brauchst ist das RFDevice. Vergiss *ALLES* andere. Es ist ein beliebter Anfaengerfehler, alles auf einmal in einem riesen Klumpatsch zum laufen zu bringen.

Starte nur zum ausprobieren mit einem NEUEN Skript, in dem ausser den Zeilen

Code: Alles auswählen

from rpi_rf import RFDevice

def receive():
      pass
      
if __name__ == "__main__":
      receive()
nix steht. Und arbeite dich dahin, das du das zum funktionieren bekommst. Naechster Schritt: receive im Hintegrund-Thread starten. OHNE das "verbotene" Modul _thread, sondern mit dem dafuer gedachten Modul threading.

Dann hast du eine Grundlage, das in deine bestehende GUI einzubauen.
mollyman
User
Beiträge: 27
Registriert: Samstag 24. Februar 2018, 12:10

Code: Alles auswählen

def receive():
    rfdevice = RFDevice(27)
    rfdevice.enable_rx()
    timestamp = None
    while True:
        if rfdevice.rx_code_timestamp != timestamp:
            timestamp = rfdevice.rx_code_timestamp
            rec_num = (str(rfdevice.rx_code))
            if rec_num == "16404":
                time.sleep(2)
                start()
        time.sleep(0.01)
Das funktioniert jetzt.

das auch:

Code: Alles auswählen

def rf_modul():
    tr = Thread(target = receive)
    tr.start()
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na sieht doch gut aus :!: Ich wuerde das time.sleep(2) noch entfernen, und stattdessen in start verschieben, weil das mE eine Entscheidung ist, die da getroffen werden sollte, und mit dem eigentlichen Empfang nichts zu tun hat. Ist aber Kuer.

Dann bau das doch mal in dein Tool ein und schau, ob's besser wird.
mollyman
User
Beiträge: 27
Registriert: Samstag 24. Februar 2018, 12:10

das receive funktioniert im Tool,auch das threading.
Das time Sleep ist noch ein überbleibsel des testens und ist jetzt auch noch rausgeflogen.

Wenn jetzt noch die letzten Einstellungen gespechert werden, wäre das toll.
Ich habe mal mit dem configparser gespielt, aber der scheint nicht so richtig zu funktionieren bei mir.
Seit dem ich die vielen Globals rausgenommen habe scheint die Logik auch nicht mehr zu funktionieren.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe ja auch nicht gesagt du sollst die rausnehmen. Ich habe gesagt das du teilweise unsinnige hast (auf modul-Ebene), und das dir in vielen Funktionen welche *fehlen*.
mollyman
User
Beiträge: 27
Registriert: Samstag 24. Februar 2018, 12:10

ok, dann hatte ich das völlig falsch verstanden
mollyman
User
Beiträge: 27
Registriert: Samstag 24. Februar 2018, 12:10

ich glaube so richtig habe ich das noch nicht verstanden mit dem Globalen Variabelen.
Das ist das, wass ich bisher verstanden habe:
  • Variabelen auf Modulebene OHNE "global" mit Werten versehen gelten nur auf Modulebene
    Variabelen auf Modulebene MIT "global" mit Werten versehen gelten auf Modulebeneund in den Funktionen
    Variabelen in einer Funktion OHNE "global" mit Werten versehen gelten nur in der Funktion
    Variabelen in einer Funktion müssen MIt "global" in der Funktion deklariert werden, bevor sie einen Wert bekommen, damit die sie als die Variabe auf Modulebene erkannt werden.
Ansonsten habe ich die globals wieder eingefügt und und das programm läuft jetzt auch Grundsätzlich.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der zweite Satz ist Unsinn. global auf Modul-Ebene ist wirkungslos. Da ist alles immer global. Das global Schlüsselwort entfaltet nur IN einer Funktion eine Wirkung.
Antworten