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_datahttps://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
