ubuntuusers.de

einen virtuellen Comport in Python erstellen

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

burli

Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

Hi, ich benötige für ein Projekt einen virtuellen Comport. Also in /dev/ttyIRGENDWAS0 z.B.

Das ganze soll aber später nicht auf einer echten Schnittstelle sondern in einem (Python)Programm landen. Wie kann man so etwas realisieren?

cn

Anmeldungsdatum:
6. Juni 2005

Beiträge: 356

Wohnort: Oberösterreich

1
sudo mkfifo /dev/ttyIRGENDWAS0

Pythonprogramm soll dann aus der Datei /dev/ttyIRGENDWAS0 lesen.

Wenn du dann etwas auf diese Datei schreibst, so wie auf ein anderes tty*, dann kann das Pythonprogramm das entgegennehmen.

burli

(Themenstarter)
Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

Geht das auch umgekehrt?

cn

Anmeldungsdatum:
6. Juni 2005

Beiträge: 356

Wohnort: Oberösterreich

Pythonprogramm schreibt und ein anderes Programm liest? Klar ☺

burli

(Themenstarter)
Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

Und das Programm greift mit normalen Dateioperationen darauf zu oder wie läuft das? Wie kann das Programm feststellen, dass etwas an die Schnittstelle geschickt wurde? Einfach permanent Pollen oder gibt es die Möglichkeit für einen Event?

cn

Anmeldungsdatum:
6. Juni 2005

Beiträge: 356

Wohnort: Oberösterreich

Wie machst du es denn bei einem physikalischen Anschluss? Gibt es da Ereignisse wenn etwas kommt und wo fragst du diese ab?

burli

(Themenstarter)
Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

Ja Moment, so rum meine ich das nicht. Das Programm ist ja sozusagen der physikalische Anschluss.

Normalerweise ist es ja so:

Modem <-> Schnittstelle <-> /dev/tty <-> Terminalprogramm

Ich möchte quasi Modem und Schnittstelle durch ein Programm ersetzen, also:

Python Programm <-> /dev/tty <-> Terminalprogramm

Was du meinst, wenn ich es richtig verstanden habe, ist das Terminalprogramm. Um das geht es mir aber nicht. Auf diese Seite soll mein Programm nicht hin

cn

Anmeldungsdatum:
6. Juni 2005

Beiträge: 356

Wohnort: Oberösterreich

Klar. Aber angenommen du hättest einen physikalischen Anschluss, dann würdest du ja vermutlich bei dem Programm, das den Anschluss anspricht, auch Ereignisse nutzen wollen. Die musst du aber irgendwo herbekommen, sprich: das Programm muss sich irgendwo anmelden, dass es ein Ereignis empfangen will wenn etwas am Anschluss eintrifft. Das gilt es zu simulieren.

DasIch

Avatar von DasIch

Anmeldungsdatum:
2. November 2005

Beiträge: 1130

/dev/tty verhält sich wie eine Datei, dass ist der Sinn von all dem Kram in /dev, irgendwie sehe ich da gerade nicht wo das Problem ist?

cn

Anmeldungsdatum:
6. Juni 2005

Beiträge: 356

Wohnort: Oberösterreich

Das Problem ist, dass Dateien keine Ereignisse auslösen 😉 .

burli

(Themenstarter)
Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

DasIch schrieb:

/dev/tty verhält sich wie eine Datei, dass ist der Sinn von all dem Kram in /dev, irgendwie sehe ich da gerade nicht wo das Problem ist?

Naja, ich weiß nicht, wie ich das umsetzen muss. Stell dir folgendes vor. Ich habe ein Terminalprogramm, das Daten zu einer seriellen Schnittstelle sendet oder von dort empfängt. Die Daten werden über eine physikalische Schnittstelle gesendet.

Diese physikalische Schnittstelle möchte ich mit einem Programm simulieren. Wenn ich also von meinem Terminalprogramm Daten sende sollen die nachher in meinem Programm ankommen.

Öffnet ich die Schnittstelle einfach wie eine Datei und wenn was kommt dann kommt was?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

burli schrieb:

Öffnet ich die Schnittstelle einfach wie eine Datei und wenn was kommt dann kommt was?

Ein fifo ist nicht einfach eine Datei, sondern mehr sowas wie eine Pipe !

Und wenn Du mal in man fifo nachschaust, findest Du den Hinweis:

When a process tries to write to a FIFO that is not opened for read on the other side, the process is sent a SIGPIPE signal.

Dieses Signal könntest Du im Prinzip wohl abfangen, um Deinen Schnittstellen-Simulator zu wecken, sobald Daten anstehen.
(also dann kein polling nötig)

LG,

track

burli

(Themenstarter)
Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

Ok, ich habs jetzt. Ich habe, wie oben beschrieben, einen virtuellen Port angelegt. Mit einem einfachen Programm kann ich Daten empfangen

f = open('/dev/ttyVCP0', 'r')
text = f.read(1)
print text
f.close()

mit

f = open('/dev/ttyVCP0', 'w')
f.write('Hello World')
f.close()

kann ich Daten senden.

Zwei Probleme: zum einen muss ich sowohl Terminal Programm als auch Python Script als root ausführen. Ich nehme an, ich muss dem virtuellen Port einfach nur den richtigen User bzw die richtige Gruppe zuweisen.

Das zweite Problem, was ich allerdings noch nicht getestet habe ist wohl, dass der virtuelle Port beim nächsten Neustart verschwunden ist.

Wie kann ich den Port permanent anlegen und wie kann ich den einem User oder einer Usergruppe zuweisen?

cn

Anmeldungsdatum:
6. Juni 2005

Beiträge: 356

Wohnort: Oberösterreich

Nutze das Skript /etc/rc.local, das wird beim Systemstart ausgeführt.

Hinweis: Es wäre auch mal lieb wenn du einmal Danke sagst, dafür dass dir ein paar Leute weiterhelfen.

burli

(Themenstarter)
Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

cn schrieb:

Nutze das Skript /etc/rc.local, das wird beim Systemstart ausgeführt.

Alles klar. Es funktioniert. Ich hab allerdings den User angeben müssen. Die Gruppe "users" hat nicht funktioniert. Man könnte höchstens die Gruppe "plugdev" verwenden oder eine neue anlegen

Hinweis: Es wäre auch mal lieb wenn du einmal Danke sagst, dafür dass dir ein paar Leute weiterhelfen.

Ich bedanke mich bei so etwas immer. Aber normalerweise am Ende, nicht für jede einzelne Frage. In einem normalen Gespräch macht man das normalerweise ja auch nicht, oder zumindest nur in gewissen Situationen.

Jedenfalls Danke für die Hilfe. Es tut jetzt, was ich wollte

Antworten |