Anfängerproblem mit pyserial in Skript

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.
Antworten
HWe
User
Beiträge: 2
Registriert: Samstag 19. Januar 2013, 11:35

Hallo,
ich hab erst gestern mit Python angefangen und heute schon das erste Problemchen :

Öffnen des seriellen Ports "/dev/USB0" klappt über die - wie heisst es doch gleich ? - interaktive Kommandozeile, oder so:

Code: Alles auswählen

>>> device = '/dev/ttyUSB0' 
>>> baudrate = '19200'
>>> time_out = 2         
>>> port= serial.Serial(device,baudrate,timeout=time_out)
>>> port.isOpen()
True
>>> port.close()
aber in folgendem Skript kommmt immer "Failed to open..." (auch als root) - Warum ?

Code: Alles auswählen

#! /usr/bin/python
### import modules
import serial
import time
### variables and constants
device = '/dev/ttyUSB0' #default is 9200,8,N,1,timeout=0
baudrate = '19200'
time_out = 2 		#timeout is necessary to avoid deadlock of the script while receiving
### main
port= serial.Serial(device,baudrate,timeout=time_out)
time.sleep(1)	

if port.isOpen() != 'true' :
   print "Failed to open ", device
else :
   print "Opened ", device," succesfully !"
Wo steckt hier mein Anfängerfehler ?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Code: Alles auswählen

$ python
Python 2.6.8 (unknown, Jun  9 2012, 11:30:32)
[GCC 4.5.3] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True == 'true'
False
In specifications, Murphy's Law supersedes Ohm's.
HWe
User
Beiträge: 2
Registriert: Samstag 19. Januar 2013, 11:35

pillmuncher hat geschrieben:

Code: Alles auswählen

$ python
Python 2.6.8 (unknown, Jun  9 2012, 11:30:32)
[GCC 4.5.3] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True == 'true'
False

Äähm, ja, danke!
Dann mach ich halt

Code: Alles auswählen

if port.isOpen() != 1 :
oder

Code: Alles auswählen

if port.isOpen() != True :
dann gehts !

Beginnersdank!
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Vergleiche gegen Booleans sind schlechter Stil, das lässt sich wesentlich eleganter lösen.

Code: Alles auswählen

if not port.isOpen():
BlackJack

@HWe: Ergänzend zu pillmuncher:

Code: Alles auswählen

In [1]: type(True)
Out[1]: bool

In [2]: type('true')
Out[2]: str

In [3]: True == 'True'
Out[3]: False
Nicht das jemand am Ende denkt man hätte bloss auf Gross- und Kleinschreibung achten müssen. :-)

Letztendlich braucht man dort aber gar keinen Vergleich, denn Vergleiche mit literalen Wahrheitswerten sind hier unnötig und damit mindestens schlechter Stil. Das `isOpen()` gibt ja schon einen Wahrheitswert zurück. Wenn man auf das Gegenteil davon testen möchte, sollte man ``not`` verwenden. Letztendlich hätte ich hier wohl einfach auf `isOpen()` getestet und den Inhalt der beiden Zweige von dem ``if``/``else`` vertauscht.
Antworten