Seite 1 von 1

Eigenes Modul / Klasse: Fremd-Modul pySerial - wie richtig?

Verfasst: Mittwoch 25. Februar 2009, 15:56
von whaeva
Für eine Reihe von seriell angeschlossenen Geräten brauche ich Module zur Kommunikation. Mittel der Wahl ist da wohl pySerial:
http://pyserial.wiki.sourceforge.net/pySerial

modul.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# kommentar
"""
docstring

"""

import sys
import serial


class Device(object):
	"""
	docstring
	"""
	
	def __init__(self, port):
		self.serial = serial.Serial()				# pySerial
		self.serial.port = port
		self.serial.baudrate = 19200
		self.serial.timeout = 2						# seconds
		self.serial.bytesize = serial.EIGHTBITS
		self.serial.parity = serial.PARITY_NONE
		self.serial.stopbits = serial.STOPBITS_ONE
...
Die Klasse bekommt eine Methode in der der Port geöffnet wird und wo dann die Kommunikation stattfindet. Die Instanz liefert dann z.B. ein tuple mit Werten

Code: Alles auswählen

dev = Device("/dev/ttyS0")
dev.read()
-> (datum1, datum2, ..)
Leider habe ich praktisch noch keine Erfahrung mit OO, deshalb würde ich mich über ein paar Tipps freuen, wie man das Ganze "besser" lösen kann (ich habe das ungute Gefühl, dass das geht :-).

Z.B. frage ich mich, ob es nötig ist, jedesmal den Port neu zu öffnen - in der Hinsicht, dass diese Module später mal irgendwie als Threads zusammenwerkeln sollen und dann quasi ständig aktiv sind.
Da muss ich mich noch einlesen.

Die unmittelbarere Frage ist, ob der Weg, innerhalb meiner Klasse eine Instanz von pySerial zu erzeugen, der richtige ist - unter welchen Umständen würde man pySerial "erweitern"?

Ist es ratsam, die Daten als Rückgabewert zu übergeben, oder sollten lieber Attribute verwendet werden? Oder sogar ein eigenes Objekt zur Datenübergabe?

Lassen sich Shebang, Kommentare und Docstring so gemischt in einem Modul benutzen?

Verfasst: Mittwoch 25. Februar 2009, 16:05
von derdon
whaeva hat geschrieben:Lassen sich Shebang, Kommentare und Docstring so gemischt in einem Modul benutzen?
Ja. Das hättest du aber auch selber herausfinden können indem du ein Minimalbeispiel erstellst, das auf dieses Problem reduziert ist.

Verfasst: Mittwoch 25. Februar 2009, 16:06
von whaeva
> Die Klasse bekommt eine Methode in der der Port geöffnet wird
> ..
> Z.B. frage ich mich, ob es nötig ist, jedesmal den Port neu zu öffnen

Ist es nicht möglich, dass das Objekt die Verbindung beinhaltet? Dann müsste das serial.open() einfach schon in der Klasse stattfinden.

Gab's da nicht auch was, das dann beim "Tod" der Instanz automatisch die Verbindung schließt?

Verfasst: Mittwoch 25. Februar 2009, 21:11
von BlackJack
@whaeva: Python hat keine deterministischen Destruktoren, also musst Du selber sicherstellen, dass Resourcen wieder freigegeben werden.

Neben einer `close()`-Methode oder etwas vergleichbarem könntest Du Dir die ``with``-Anweisung anschauen und wie man Objekte implementiert, die damit zusammenarbeiten.