Seite 1 von 1

serial open windows

Verfasst: Freitag 4. März 2022, 10:59
von yogie
Hallo zusammen,
bisher habe ich vorwiegend in anderen Sprachen programmiert (FORTRAN, BASIC, DELPHI ...)
Python ist Neuland. Es geht um eine serielle Schnittstelle (via USB Adapter).
Obwohl ich nach der Initialisierung des Ports am Programmanfang versuchsweise den Port schließe

try:
ser.close()
except:
print("except close")

klappt ein anschließendes

ser.open()

nicht immer, besonders nicht wenn vorher im Programmlauf etwas schief gegangen ist.
Gibt es eine Möglichkeit, beim Programmstart die serielle Schnittstelle in einen "sicheren" Zustand zu bringen.

Re: serial open windows

Verfasst: Freitag 4. März 2022, 20:21
von Sirius3
Was soll es helfen, einen eben geöffneten Port gleich wieder zu schließen?

Wie äußern sich denn Deine Probleme? Was bedeutet "schief gegangen"?
Was willst Du machen? Wie sieht Dein Programm aus? Was sind die Fehler, die Du bekommst?

Bei einer Kommunikation gibt es immer zwei Seiten. Man muß also beide Seiten in einen Zustand versetzen, wo sie wieder miteinander Reden können und auch verstanden werden. Was konkret zu tun ist, hängt davon ab, mit welchen Geräten Du reden willst.

Re: serial open windows

Verfasst: Freitag 4. März 2022, 20:27
von __deets__
Serielle Schnittstellen bleiben nicht offen, wenn es nicht jemanden gibt, der das aktiv betreibt. Und es gibt auch keinen Grund, sie während des Programmlaufs zu schließen und wieder zu öffnen, weil die Gegenstelle von sowas nichts mit kommt. Warum kannst du also die Schnittstelle nicht einmal zu Beginn öffnen, und das war es?

Re: serial open windows

Verfasst: Samstag 5. März 2022, 10:32
von yogie
Mein Testprogramm

Code: Alles auswählen

import sys
import glob
import time
import serial

myPort = 'COM3'

serPort = serial.Serial(myPort)
serPort.baudrate = 115200
serPort.timeout = 1

try:
    serPort.close()
except:
    print('exception')
    
serPort.open()

serPort.write(b'v\r')                         # Abfrage Version an Messgerät senden
response = serPort.read_until(b'\r').strip()  # Version empfangen
print(response)                               # Version anzeigen

error = 1/0 # Fehler erzeugen
"""
Ohne ezeugten Fehler kann das Programm mehrfach gestartet werden und läuft.
Mit ezeugtem Fehler kommt beim nächsten Start dei Fehlermeldung
  could not open port 'COM3': PermissionError(13, 'Zugriff verweigert', None, 5)

Diese Situation soll vemieden werden. Ich habe versucht beim Start des Programms
den Port vorsorglich zu schließen, das bringst aber nichts.
"""

serPort.close()

# Ende des Programms

Re: serial open windows

Verfasst: Samstag 5. März 2022, 10:36
von __deets__
Statt die Exception abzufangen & durch eine nichtssagende Fehlermeldung zu ersetzen, bitte mal zeigen, was genau da geworfen wird.

Und wenn du baud und timeout gleich im Konstruktor übergibst, dann braucht man auch diesen schließ/öffnen Zirkus nicht, weil der schon offen sein sollte. Wohingegen das was, du machst, falsch ist: wenn man nachträglich öffnen will, darf man NICHTS übergeben. Sonst wird der eben schon geöffnet.

https://pyserial.readthedocs.io/en/late ... orts-later

Re: serial open windows

Verfasst: Samstag 5. März 2022, 11:14
von Sirius3
Das Präfix my ist unsinn, weil es nichts zur Erklärung beiträgt.
Konstanten schreibt man komplett gross, Variablennamen dagegen komplett klein.

Dateiobjekte öffnet man immer innerhalb des with-Statements, das sorgt dafür, dass close immer aufgerufen wird, auch bei Fehlern, was Dein Problem lösen sollte.
`glob`, `sys` und `time` werden importiert aber nicht benutzt.

Code: Alles auswählen

import serial

PORT = 'COM3'

def main():
    with serial.Serial(PORT, baudrate=115200, timeout=1) as serial_port:
        # Abfrage Version an Messgerät senden
        serial_port.write(b'v\r')
        # Version empfangen
        response = serial_port.read_until(b'\r').strip()
        print(response)

        error = 1/0 # Fehler erzeugen

if __name__ == "__main__":
    main()