Serielle Schnittstelle auslesen und in Datei kopieren

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
morph
User
Beiträge: 15
Registriert: Dienstag 23. Mai 2006, 13:05

Hallo,

ich möchte an einem Rechner die serielle Schnittstelle auslesen. Ziel ist es, Daten, die über eine serielle Schnittstelle an einen Drucker gesendet werden, mitzuschneiden und in eine Datei zu schreiben. Soweit ist das Ganze ja auch kein Problem, mit Pyserial die Schnittstelle auslesen, und mit write den Inhalt in eine Datei wegschreiben. Nun soll aber der Dateiinhalt einmal täglich, oder wöchentlich auf eine Diskette weggeschrieben werden und das Ganze möglichst ohne Interaktion durch den Benutzer, dessen Tätigkeit sich ausschließlich auf das Einlegen und Entnehmen der Diskette beschränken soll.

Mein erster Versuch sieht so aus:

Code: Alles auswählen

#! /usr/local/bin/python

import serial
import os
from time import *

ser = serial.Serial(port=0, timeout=10)
protocol=open('/logfile/serlog', 'a')

while ser.isOpen():
	line = ser.readline()
	protocol.write(line)
	zeit = localtime()
	tag = zeit[6]
	if tag == 6 and wochenflag == 0:
		wochenflag = 1
		protocol.close()
		rename('/root/serlog', 'auswertung')
		protocol=open('/root/serlog', 'a')
	if tag < 6:
		wochenflag = 0
In diesem Fall würde die Datei "Auswertung" dann per Cronjob auf die Diskette kopiert und danach gelöscht werden - kann man aber natürlich auch innerhalb von Python erledigen. Was mir allerdings überhaupt nicht gefällt, ist dieses Konstrukt mit der Endlosschleife und die Tatsache, dass jedes mal wieder abgefragt wird, ob schon der 6. Wochentag ist.

Ich wurschtel mich erst gerade so in die Programmierung mit Python rein, von daher ist der Ansatz sicherlich alles andere als perfekt. Hat jemand von Euch eine Anregung, wie ich das Ganze eleganter lösen könnte? Es ist ja theoretisch so, dass permanent Daten über die serielle Schnittstelle kommen könnten, also müsste eigentlich die Schnittstelle dauernd ohne Timeout ausgelesen werden. Dann habe ich allerdings das Problem, dass das Programm in dieser Abfrage festhängt und die Wochentags- bzw. Uhrzeitabfrage nicht mehr erfolgen kann.

Gruss, Dirk
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Kenn den Timer von Python nicht so, aber evtl geht es mit dem ;)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

morph hat geschrieben:Hat jemand von Euch eine Anregung, wie ich das Ganze eleganter lösen könnte?
Hi Dirk!

Vielleicht ist dir mit dem logging-Modul gedient.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import logging
import logging.handlers
import serial


# Logger initialisieren
log_handler = logging.handlers.TimedRotatingFileHandler(
    filename = "serlog.log", when = "D", interval = 1, backupCount = 7
)
log_handler.setFormatter(logging.Formatter('%(message)s'))
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)
root_logger.addHandler(log_handler)

# Restliches... :-)
ser = serial.Serial(port = 0, timeout = 10)
while ser.isOpen():
    line = ser.readline()
    logging.info(line)
http://docs.python.org/lib/node349.html
http://docs.python.org/lib/module-logging.html

mfg
Gerold
:-)
Zuletzt geändert von gerold am Montag 24. Juli 2006, 21:22, insgesamt 2-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
morph
User
Beiträge: 15
Registriert: Dienstag 23. Mai 2006, 13:05

gerold hat geschrieben: Vielleicht ist dir mit dem logging-Modul gedient.
Super, das entspricht genau dem, was ich mir vorgestellt hab.

Mann, ist das deprimierend, wenn man sich da was zurechtwurschtelt und dann sehen muss, dass die Lösung eigentlich so einfach und wesentlich eleganter sein kann :?

Gruss, Dirk
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

morph hat geschrieben:so einfach und wesentlich eleganter
Hi Dirk!

Freut mich wenn du es so verwenden kannst. :D

Allerdings bin ich der Meinung, dass dieses logging-Modul (Achtung: Kritik an die Python-Entwickler) unnötig kompliziert aufgebaut ist. Also einfach war es nicht, dieses Codeschnipsel aus der Dokumentation heraus zu lesen. Das Mindeste, was ich mir wünschen würde, wären mehr Beispiele zu diesem Thema.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:Allerdings bin ich der Meinung, dass dieses logging-Modul (Achtung: Kritik an die Python-Entwickler) unnötig kompliziert aufgebaut ist.
http://www.red-dove.com/python_logging.html hat geschrieben:By a happy coincidence, the package described here was already in development and fairly close in intent and design to the description in the aforementioned PEP, borrowing as it did heavily from JSR-47 (now JDK 1.4's java.util.logging package) and log4j.
Ja, das kommt davon, wenn man sich zu sehr an Java orientiert und von log4j zu viele Anleihen macht.

Aber freuen wir uns, dass zumindest neben dem Java'esken SAX und DOM nun mit ElementTree ein XML-Parser in Python 2.5 aufgenommen wird, der eine angenehme, pythonische API hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

hmm.....

mir fällt da was leichtes ein:

setserial ( am besten mit man setserial überprüfen was man da alles einstellen kann ) kann man die schnittstellenparameter einstellen
mit cat /dev/ttyS0 ( wäre dann com1, ttyS1 ist com2, usw... ) kann man es auslesen
mit cat /dev/ttyS0 > file.txt wandert es in ne datei
mit cp quelle ziel im cronjob kommt das ganze woanders hin

ist das simpel genug?

mfg tlb :)
riven
User
Beiträge: 35
Registriert: Mittwoch 27. September 2006, 23:01

hallo,
wenn ich richtig verstanden habe, kann man mit logging alles, was vom com-port kommt, loggen und in eine datei schreiben.
wenn ich dieses tool starte, dannaktiviert sich python und führt das programm aus.
das programm lässt sich aber nur durch Strg+F6 beenden.

kann mir jemand erklären, wie man dieses tool handhaben kann?

danke
riven
User
Beiträge: 35
Registriert: Mittwoch 27. September 2006, 23:01

hallo,

ich drücke es mal anders aus.
In einer Routine werden mehrere befehle ausgeführt.
nach jeder ausführung eines befehls leigt am com-port ein text an.
wie kann ich dafür sorgen, dass alle texte ausgelesen und in eine datei geschrieben werden ?
es soll alles geloggt werden und in eine datei geschrieben werden.

danke
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

riven hat geschrieben:wenn ich richtig verstanden habe, kann man mit logging alles, was vom com-port kommt, loggen und in eine datei schreiben.
Hi riven!

- Mit ``logging`` schreibst du Text in eine Logdatei.
- Mit ``pyserial`` (http://pyserial.sourceforge.net/) verbindest du dich über einen Serial Port mit einem Gerät und kommunizierst damit.

Wann du das Programm beenden möchtest, musst du im Programm selbst bestimmen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

gerold hat geschrieben: ... snip ...
# Restliches... :-)
ser = serial.Serial(port = 0, timeout = 10)
while ser.isOpen():
line = ser.readline()
logging.info(line)[/code]
http://docs.python.org/lib/node349.html
http://docs.python.org/lib/module-logging.html

mfg
Gerold
:-)
Gibt es denn nur die Möglichkeit mit "while" als Endlosschleife
die serielle Schnittstelle abzufragen? Wenn nur ab und zu
Daten anliegen, wäre doch so etwas wie signaling, interrupts etc.
nicht schlecht ... (hab ich auch noch nie verwendet) :roll:

Tabellar
Antworten