Schnittstelle deinitialisieren?

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
Epidauros
User
Beiträge: 20
Registriert: Freitag 4. September 2020, 13:47

Hallo zusammen,
ich habe ein Programm, das auf die serielle Schnittstelle (USB) zugreift. Diese wird natürlich initialisiert, und ein Fehler durch falsche COMPort Initialisierung wird erfolgreich abgefangen.

Code: Alles auswählen

def initser():
    try:   
        global ser, Uport
        ser=serial.Serial(
            port = Uport,              # COM Port Nummer als Variable aus Eingabemaske, wird in Funktion comport definiert
            baudrate = 115200,
            parity = serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE,
            bytesize=serial.EIGHTBITS,
            timeout=1
        )
        Errorzeile=Label(fenster, text="                                             ")
        Errorzeile.pack()
        Errorzeile.place(x = 450, y = 130)
        Portgesetzt = Label(fenster, text="COM Port ist gesetzt   ", bg="lightgreen")
        Portgesetzt.pack()
        Portgesetzt.place(x = 450, y = 55)     #Anzeige, dass COM Port gesetzt ist

    except IOError:
        print(IOError)
        Errorzeile=Label(fenster, text=IOError, fg="red", font = "calibri 12 bold italic")
        Errorzeile.pack()
        Errorzeile.place(x = 450, y = 130)
        Portgesetzt = Label(fenster, text="COM Port ist falsch     ", bg="yellow")
        Portgesetzt.pack()
        Portgesetzt.place(x = 450, y = 55)
Das COMPort gebe ich über Entry ein (Uport) und rufe die Funktion initser() auf.
Das Problem ist nun folgendes:
Wenn das COMPort richtig eingestellt war, und ich übergebe noch einmal den richtigen String, dann bekomme ich immer einen IO Error, da dasselbe COPort nicht 2x zugewiesen werden kann.

Gibt es eine Möglichkeit, die bisherige Initialisierung sozusagen zu löschen ("deinit") ?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Epidauros: Dafür ist die `close()`-Methode auf `Serial`-Objekten da.

Du solltest am besten sofort vergessen, dass es ``global`` überhaupt gibt, und echte Funktionen schreiben, die alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen. Und in diesem Fall hier brauchst Du auch eine eigene Klasse, denn um objektorientierte Programmierung kommt man bei jeder nicht-trivialen GUI nicht herum.

Was Du auch ändern solltest ist `place()`. Das macht man nicht, denn das funktioniert nicht wirklich. Nur auf dem System wo Du das programmiert hast, und solchen die sehr ähnliche Einstellungen haben was Displaygrösse und -auflösung und Systemeinstellungen verwendet. Und es ist auch unnötig umständlich und fehlernafällig wenn man an der GUI grössere Änderungen vornehmen will oder muss.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine Abkürzungen, wenn Du init_serial meinst, dann schreib das auch aus. Was Das U bei Uport bedeuten soll, kann man nur raten. Ist das ein Hafen für U-Bote?
`fenster` kommt aus dem nichts. Das solltest Du als Argument übergeben. Fensterelemente sollte man auch nur beim Initialisieren erzeugen, und später nur noch den Inhalt ändern. Warum rufst Du init_serial überhaupt mehrmals auf.
Die Aussage, dass der Fehler erfolgreich abgefangen wurde, bezweifle ich. Denn bei einem Fehler wird `ser` kein sinnvoller Wert zugewiesen.
Epidauros
User
Beiträge: 20
Registriert: Freitag 4. September 2020, 13:47

Vielen Dank für eure Tips!
Dies ist mein allererstes Python Projekt und ich bin froh, dass ich die Anwendung ans Laufen bekomme habe.
Ich mache mich daran, eure Tips zu beherzigen und gehe mal in de Keller zum Aufräumen.

Ihr seid das beste Forum der Welt!
Antworten