Forum: PC-Programmierung Python Serial Port, mehrere Nodes


von Matze (Gast)


Lesenswert?

Hallo,

ich habe vier gleiche Sensoren die per RS232 an einer COM hängen. Im 
String wird dann jeweils eine entsprechende ID gesendet. Jetzt möchte 
ich ein Modul in Python schreiben:

class MeinSensor(object):
    def __init__(self, port):
        self.com = serial.Serial(port, baudrate, usw)

    def lesen(self, adr)
        self.com.write(lesekommando)
        return_value = self.com.read
        return return_value

Ich würde also gerne vier Objekte erzeugen. Was passiert mit dem Serial 
Port? Bestenfalls würde ich den doch zum Programmstart öffnen und zum 
Ende schließen. Wie verhält sich das bei Python?

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Matze schrieb:
> Bestenfalls würde ich den doch zum Programmstart öffnen und zum
> Ende schließen.
Warum machst du es dann nicht einfach so?
1
class Sensor:
2
    def __init__(self, com_port_obj):
3
        self.com = com_port_obj
4
5
6
def main():
7
    com_port = serial.Serial(...) # com port oeffnen
8
9
    sensor_1 = Sensor(com_port)
10
    sensor_2 = Sensor(com_port)
11
    sensor_3 = Sensor(com_port)
12
    sensor_4 = Sensor(com_port)
13
14
    # com port schliessen
15
    com_port.close()
16
17
if __name__ == '__main__':
18
    main()

Matze schrieb:
> Wie verhält sich das bei Python?
Was meinst du?
So wie du es in deinem Beispielcode zeigst, wird jedes neue Objekt von 
MeinSensor versuchen den Com-Port zu oeffnen. Ist es jedesmal ein 
anderer Port, ist das kein Problem. Ist es aber immer der selbe Port, 
koennte das vielleicht zu problemen fuehren (Schnittstelle schon 
geoeffnet/blockiert). Erzeuge einfach ein Objekt fuer den Com-Port, und 
gib dieses Com-Port-Objekt in deine Klasse rein. (siehe mein Beispiel).

von Rolf M. (rmagnus)


Lesenswert?

Matze schrieb:
> Hallo,
>
> ich habe vier gleiche Sensoren die per RS232 an einer COM hängen. Im
> String wird dann jeweils eine entsprechende ID gesendet.

RS232 ist für Punkt-zu-Punkt-Verbindungen gedacht. Es ist kein Bus, und 
IDs gibt es da nicht. Wenn du mehrere TX-Leitungen parallel schaltest, 
schließen sie sich gegenseitig kurz.

: Bearbeitet durch User
von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Rolf M. schrieb:
> Es ist kein Bus, und IDs gibt es da nicht.
Von Natur aus nicht, das ist Richtig. Aber ein entsprechendes Protokoll 
gibt das her, z.B. ccTalk.

Rolf M. schrieb:
> Wenn du mehrere TX-Leitungen parallel schaltest,
> schließen sie sich gegenseitig kurz.
Auch hier als Beispiel: ccTalk
Alle RX und TX liegen auf einer einzigen Leitung, und das funktioniert 
ganz wunderbar. Praktisch ein "One-Wire-Bus" ueber RS232.
1
master        slave 1       slave 2       slave n
2
 |  |          |  |          |  |          |  |
3
rx  tx        rx  tx        rx  tx        rx  tx
4
 |  |          |  |          |  |          |  |
5
 +--+----------+--+----------+--+----...---+--+

https://en.wikipedia.org/wiki/CcTalk
1
The protocol uses an asynchronous transfer of character frames in a
2
similar manner to RS232. The main difference is that it uses a single
3
two-way communication data line for half-duplex communication rather
4
than separate transmit and receives lines. It operates at TTL voltages
5
and is ‘multi-drop’ i.e. peripherals can be connected to a common bus
6
and are logically separated by a device address. Each peripheral on the
7
ccTalk bus must have a unique address.

Ja, wir wissen nicht was die Sensoren fuer ein Protokoll sprechen. Aber 
prinzipiell ist das, was der TO da schreibt, weder unmoeglich noch 
ungewoehnlich, sondern wird genau so in der Industrie gemacht.

von Baku M. (baku)


Lesenswert?

Kaj G. schrieb:
>[...]
> Ja, wir wissen nicht was die Sensoren fuer ein Protokoll sprechen. Aber
> prinzipiell ist das, was der TO da schreibt, weder unmoeglich noch
> ungewoehnlich, sondern wird genau so in der Industrie gemacht.

Moinsen,
unwidersprochen, aber das setzt ein entsprechendes Protokoll bei Sendern 
und Empfängern voraus.
Nichts führt aber darum herum, eine einzige Empfängerinstanz auf dem 
(einzigen) seriellen Port zu haben, die die Empfangstelegramme 
auseinanderflöht und den verschiedenen Endabnehmern zuweist. Es ist 
nicht möglich (und obendrein auch nicht sinnvoll) einen seriellen Port 
mehrfach von unabhängigen Instanzen zu öffnen und zu nutzen.

Es grüßt
Baku

von Rolf M. (rmagnus)


Lesenswert?

Kaj G. schrieb:
> Alle RX und TX liegen auf einer einzigen Leitung, und das funktioniert
> ganz wunderbar. Praktisch ein "One-Wire-Bus" ueber RS232.

Naja, aber das:

Kaj G. schrieb:
> It operates at TTL voltages

ist eigentlich auch kein RS232. Wenn man mit einem anderen Physical 
Layer arbeitet und ein passendes Protokoll draufsetzt, geht das 
natürlich. Ich hatte das Ursprungsposting aber so verstanden, dass hier 
eine echte RS232 in einem PC verwendet wird.

: Bearbeitet durch User
von Matze (Gast)


Lesenswert?

Der Bus ist RS485, für den Rechner aber RS232, da ein entsprechender 
Konverter vorhanden ist, der auch das DE/RE-Handling übernimmt.

von Gustl B. (-gb-)


Lesenswert?

self.com.write(lesekommando)
return_value = self.com.read

wird nicht funktionieren.

Dazwischen muss eine Pause rein. Das Betriebsystem braucht Zeit zum 
Senden, dann muss empfangen werden und je nach Baudrate kann das lange 
dauern. Aber es dauert auch bei hoher Baudrate länger als im 
Pythonskript die zweite Zeile ausgeführt wird. Du wirst also nichts 
lesen oder wenn du zyklisch liest, dann die Daten vom vorherigen Zyklus.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Gustl B. schrieb:
> Dazwischen muss eine Pause rein. Das Betriebsystem braucht Zeit zum
> Senden, dann muss empfangen werden und je nach Baudrate kann das lange
> dauern. Aber es dauert auch bei hoher Baudrate länger als im
> Pythonskript die zweite Zeile ausgeführt wird. Du wirst also nichts
> lesen oder wenn du zyklisch liest, dann die Daten vom vorherigen Zyklus.
Schwachsinn. Lies mal bitte die Doku bevor du hier so einen Unfug 
verbreitest.

https://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.read
1
Read size bytes from the serial port. If a timeout is set it may return
2
less characters as requested. With no timeout it will block until the
3
requested number of bytes is read.

: Bearbeitet durch User
von Gustl B. (-gb-)


Lesenswert?

OK, sorry, stimmt. Daran hatte ich nicht gedacht. Ich verwende immer 
timeout=0 und muss dann eben manuell warten. Weil ich von einem 
Datenstrom lese der mal mehr mal weniger schickt kann ich auch nicht fix 
auf eine feste Größe warten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.