Python Serial Port, mehrere Nodes

Gast #5344588
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?
(Firma: RUB) #5344677
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).
(Firma: RUB) #5347117
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.
#5347175
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
#5347488
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.
#5355912
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.
(Firma: RUB) #5356085
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren