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
Schnittstelle COM-Port einbinden
in der Dokumentation dazu steht was.
-
- 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
________________________________________________________________
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
- __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:
Wie man die Antwort lesen kann hängt davon ab in welcher Form die kommt. Woher weisst Du wann die Antwort komplett ist?
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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari