Schnittstelle COM-Port einbinden

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
patrick1706
User
Beiträge: 4
Registriert: Freitag 29. November 2019, 09:34

Hallo,

ich bin neu in der Thematik mit Python und habe erst wenig Kenntnisse.
Ich will eine Schnittstelle implementieren. Habe das Gerät an den Rechner angeschlossen, befindet sich auf dem COM9.
Ich verwende Pycharm und habe mal folgenden Befehl generiert:

import serial
ser = serial.Serial(port='COM9', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, timeout=1)



So wie kann ich nun feststellen ob mein Gerät von der Software angesprochen werden kann? Bzw. was wären die nächsten Befehle?

Viele Grüße und vielen Dank

Patrick
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

in der Dokumentation dazu steht was.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Jenseits von den beiden Methoden read und write gibt’s da nicht mehr zu sagen - denn wir wissen nicht, WAS das für ein Gerät ist. Und davon hängt das nunmal ab.
patrick1706
User
Beiträge: 4
Registriert: Freitag 29. November 2019, 09:34

Danke mal soweit.. Habe jetzt folgenden Code geschrieben:

________________________________________________________________
import serial
import sys
import threading
import re
import time

try:
ser = serial.Serial(port='COM9',
baudrate=115200,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=20000)
print("Serial port is open")

except Exception as e:
print("error open serial port: " + str(e))
exit()

try:
ser.write(b'\r')
ser.write(b'reboot')
print("write data: reboot")

except Exception as e:
print("error communicating...: " + str(e))
_______________________________________________________

und bekomme das Ergebnis:

Serial port is open
write data: reboot

Process finished with exit code 0

_________________________________________________________

Jetzt möchte ich die Seriennummer meines Geräts ausfassen, in der Dokumentation gibt es folgenden command befehl:


Command: “*idn?”

wie kann ich nun den read befehl in meinen code schreiben?

Viele Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@patrick1706: Da wird ein ganzer Zoo von Modulen importiert die überhaupt gar nicht verwendet werden‽

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

`exit()` dürfte es eigentlich gar nicht geben. Das ist nicht dokumentiert und ist nur da weil es das in der interaktiven Python-Shell gibt. Ansonsten muss man explizit `sys` importieren. Mit `sys.exit()` sollte man sparsam umgehen und das nur aufrufen wenn man tatsächlich einen anderen Rückgabecode als 0 an den Aufrufer zurückgeben möchte. Andernfalls ist das in der Regel ein Hack um sich um einen strukturierten Programmablauf zu drücken.

Die Ausnahmebehandlung ist schlecht. Wenn man nichts sinnvolles macht/machen kann, dann behandelt man Ausnahmen *gar nicht*. Alle Ausnahmen zu behandeln in dem man den Stacktrace unterdrückt macht die Fehlersuche nur unnötig schwer.

Zeichenkette und Werte mit ``+`` und `str()` zusammenstückeln ist eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode auf Zeichenketten und ab Python 3.6 f-Zeichenkettenliterale.

Serielle Schnittstellen gehören genau wie Dateien zu den Ressourcen die man ordentlich wieder aufräumen sollte. Also hier `close()` aufrufen wenn man fertig ist — was auch Ausnahmefälle mit einschliesst! `Serial`-Objekte machen das einfach weil sie Kontextmanager sind und mit ``with`` verwendet werden können.

Man sollte kryptische Abkürzungen bei Namen vermeiden. `ser` könnte man beispielsweise `serial_port` oder `connection` nennen.

Bei einem 20.000 Sekunden `timeout` würde ich wahrscheinlich einen Kommentar dazu schreiben wie lange das ist, also etwas über 5½ Stunden. Einige Schlüsselwortargumente dort haben explizit den Default-Wert übergeben. Kann man machen, muss man aber nicht.

Das *vor* dem Befehl ein Wagenrücklauf ("\r") gesendet wird statt *danach* ist komisch. Soll das so? Woran erkennt das externe gerät, dass der Befehl vollständig ist? Warum wird das in zwei Aufrufen gemacht?

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import serial


def main():
    # Timeout of 5 hours, 33 minutes, and 20 seconds = 20,000 s
    with serial.Serial(
        port="COM9", baudrate=115_200, timeout=20_000
    ) as connection:
        print("Serial port is open")
        #
        # TODO Really in this order?
        #
        connection.write(b"\r")
        connection.write(b"reboot")
        print("write data: reboot")


if __name__ == "__main__":
    main()
Wie man die Antwort lesen kann hängt davon ab in welcher Form die kommt. Woher weisst Du wann die Antwort komplett ist?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten