Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
#!/usr/bin/env python
import serial
s = serial.Serial('/dev/ttyUSB0') # USB-to-serial Converter
s.setRTS(True)
s.setDTR(False)
s.close()
Leider schaltet sich die Steckdose am Ende des Skriptes wieder aus, anstatt die RTS und DTR im entsprechenden Zustand zu lassen?!? Habe jetzt die Doku von pySerial schon zwei Mal durch, komme aber nicht dahinter, ob ich dieses Verhalten irgendwie ändern kann?! Hat da vielleicht jemand einen Tipp für mich?
Ich kann das jetzt nicht 100%ig bestaetigen, aber wuerde mal behaupten, das Betriebssystem hat da seine Finger drin. Eine Serielle Schnittstelle wird da denke ich einfach mal in einen Standardzustand gebracht.
Gibt's nen Grund, warum du das Skript nicht endlos laufen lassen kannst? Mit time.sleep natuerlich, um wenig bis keine Rechenzeit zu konsumieren, und vielleicht als daemon?
deets hat geschrieben:Gibt's nen Grund, warum du das Skript nicht endlos laufen lassen kannst? Mit time.sleep natuerlich, um wenig bis keine Rechenzeit zu konsumieren, und vielleicht als daemon?
Naja, das ist nur begrenzt schick, da muss ja der Rechner ständig laufen. Soviel zu Stromsparen. Außer man nutzt jetzt nen Raspberry Pi dafür
Ich würd mal schauen ob das Problem auch mit GNU screen und picocom auftritt, wenn man das gleiche macht, dann kann man gucken ob das OS oder PySerial da dazwischenfunken.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
`serial` öffnet die entsprechende Datei unter ``/dev/`` und setzt die Leitungszustände über `fcntl`-Aufrufe. Und am Ende des Programms wird die Datei wieder geschlossen, spätestens wenn am Prozessende die noch offenen Dateien vom Betriebssystem geschlossen werden. Und da passiert dann wahrscheinlich auch das wieder herstellen des Grundzustands der Portleitungen.
Das mitgelieferte C-Beispielprogramm spricht die Ports direkt über schreiben/lesen der Register an. Das müsste man zum Beispiel mit diesem Modul in Python nachbauen können: http://portio.inrim.it/
@Leonidas: Der Rechner muss eventuell sowieso laufen, denn in der Anleitung steht die Warnung, dass das BIOS beim hoch- und runterfahren an den Portleitungen rumschalten kann.
So oder so muss die Kiste laufen - das Ding braucht ein Hi auf dem entsprechenden Signal. Es ist stateless. Sonst haette der OP ja auch nicht das Problem.
Und ob das was mit stromsparen per se zu tun hat ist ja auch nicht klar. Kann ja auch das kontrollierte EInschalten zb einer Werkzeugmaschine sein.
deets hat geschrieben:So oder so muss die Kiste laufen - das Ding braucht ein Hi auf dem entsprechenden Signal. Es ist stateless. Sonst haette der OP ja auch nicht das Problem.
Achso, ja dann ist der von dir vorgeschlagene Daemon wohl die beste Lösung. Inzwischen hat auch PyPi eine passende Library, so dass man sich nicht mehr das Rezept von ActiveState copypasten muss
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ursprünglich hatte ich einfach nur vor das vom Hersteller zur Verfügung gestellte C-Programm mit Python nachzubauen und so die Steckdose zu schalten und den Status abzufragen. Dabei bin ich auf das geschilderte Problem gestoßen.
Was ich mit der Steckdose vorhabe: An ihr hängt meine USB-Backup-HDD. Ich möchte diese skriptgesteuert einschalten, ein rsync Backup fahren und wieder ausschalten. Das werde ich jetzt einfach alles mit einem Pythonskript machen und gut ist. Dennoch hätte es mir besser gefallen, wenn ich das original C-Programm hätte nachbauen können....
Nochmals danke für die rege Diskussion!
BTW, zeigt PySerial auch bei "echten" seriellen Ports dieses Verhalten? Nur aus Neugier....
was heisst "echt"? das ist ja kein anderer serieller port - die hardware ist dieselbe. Kann das C-Programm denn das, was du erwartest - also, die Leitung oben halten? Wenn das geht, dann kann es natuerlich schon sein, dass pyserial da was anders macht, indem es den Port zuruecksetzt.
Mit "echt" meinte ich eben einen echten seriellen Port und nicht einen USB-to-serial Konverter. Ich hatte das C-Programm auf einem alten Server mit - sorry - echtem seriellen Port am laufen und ja, da hat es das so gemacht wie gewünscht. Ich kann ja alles was ich brauche in das Skript packen und gut ist, aber meine Neugier ist geweckt....
Ich hatte doch schon etwas dazu geschrieben: PySerial benutzt Dateien unter ``/dev/`` und `fnctl`-Aufrufe um die Leitungen zu steuern und das C-Programm geht direkt an die I/O-Register ran.
Edit: Da wüsste ich übrigens so spontan gar nicht ob das C-Programm überhaupt mit USB/Seriell-Adaptern funktioniert.