um die Daten über den Aktuellen Ladezustand vom BMS über die OBD-Schnittstelle auszulesen verwende ich ein Python-Sycript auf einem PI-Zero W.
Als Oberfläche für gewisse Handeingaben verwende ich Kivy.
Das ganze funktioniert recht gut, aber ab und zu bekomme ich beim auslesen der Schnittstelle eine exeption:
Code: Alles auswählen
Exception in thread Thread-12:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 490, in read
'device reports readiness to read but returned no data '
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "/usr/lib/python3.5/threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "./ConsumptionMonitorApp.py", line 154, in OBD_thread
obddata=self.get_bms_data("2101","PID 2101 Abfragen",Dongel)
File "./ConsumptionMonitorApp.py", line 356, in get_bms_data
reading = OBD_Dongel.read()
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 497, in read
raise SerialException('read failed: {}'.format(e))
serial.serialutil.SerialException: read failed: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Code: Alles auswählen
def get_bms_data(self,command,AusgabeText,OBD_Dongel):
self.SetToast(AusgabeText)
local_data="Unknown command"
if command=="2105":
OBD_Dongel.write(b'2105\r\n')
else:
OBD_Dongel.write(b'2101\r\n')
OBD_Dongel.flush()
seq = []
joineddata=''
while True:
reading = OBD_Dongel.read()
seq.append(reading)
joineddata = ' '.join(str(v) for v in seq).replace(' ', '')
err = re.search('ERROR', joineddata)
if err:
self.SetToast("Befehl " + command + "ist Fehlgeschlagen")
local_data="Fehler"
break
Unbekannt = re.search('\?', joineddata)
if Unbekannt:
self.SetToast("Befehl " + command + "ist Unbekannt")
local_data="Unknown command"
break
m = re.search('>', joineddata)
if m:
tmpdata0=bytes('-',"utf-8").join(seq)
tmpdata1=tmpdata0.decode("utf-8")
tmpdata2=tmpdata1.replace(' ', '')
tmpdata3=tmpdata2.replace('-', '')
local_data=tmpdata3.replace('\r', '')
self.SetToast("Befehl " + command + " ist Abgearbeitet")
break
return local_data
https://github.com/olsvse/GUIConsumptionMonitorEV
Die Zeilen sind dort um 1 zu der Fehlermeldung verschoben.
Wie müsste ich jetzt einen try-Exeption-Block machen, damit ich entweder die Anfrage noch einer kurzen Zeit nochmals Wiederhole oder ich initialisiere mir nochmals die Verbindung mit "init_Dongel".
Momentan gehe ich davon aus, dass das Warten von einer Sekunde und dann ein neuer Read funktionieren müsste.
PS.: ich weis, dass meine Variablen-Namen nicht ganz Python-Like sind.
Gruß,
OlSvSe