Seite 1 von 1

pySerial

Verfasst: Samstag 2. Juni 2012, 08:47
von Tom7320
Moin!

Ich würde gerne mit Python diese Steckdose per COM Port steuern:

http://www.antrax.de/site/Onlineshop/Ho ... is::5.html

Das ist eigentlich auch trivial (hier das Einschalten):

Code: Alles auswählen

#!/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?

Vielen Dank!

Beste Grüße,

Thorsten

Re: pySerial

Verfasst: Samstag 2. Juni 2012, 09:29
von deets
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?

Re: pySerial

Verfasst: Samstag 2. Juni 2012, 10:07
von Leonidas
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.

Re: pySerial

Verfasst: Samstag 2. Juni 2012, 10:16
von BlackJack
`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.

Re: pySerial

Verfasst: Samstag 2. Juni 2012, 10:17
von deets
@Leoniadas

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.

Re: pySerial

Verfasst: Samstag 2. Juni 2012, 10:29
von Leonidas
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 :)

Re: pySerial

Verfasst: Sonntag 3. Juni 2012, 11:58
von Tom7320
Hui, das sind aber viele Antworten! Besten Dank!

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....

Schönen Sonntag!

Thorsten

Re: pySerial

Verfasst: Sonntag 3. Juni 2012, 12:00
von deets
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.

Re: pySerial

Verfasst: Sonntag 3. Juni 2012, 12:29
von Tom7320
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.... :D

Re: pySerial

Verfasst: Sonntag 3. Juni 2012, 13:04
von deets
Das sind ja 2 Fragen in einer: gibt's nen Unterschied zwischen USB und Legacy COM-ports, und gibt's einen zwischen den beiden Programmen.

Ersteres kannst nur du ausprobieren, letzteres kann man durch den Blick in die Quellen versuchen zu deduzieren.

Re: pySerial

Verfasst: Sonntag 3. Juni 2012, 13:35
von BlackJack
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.