Serielle Kommunikation

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
mochtend

@Sirius3 da meine Künste im erläutern von Problemstellungen anscheinend nicht so gut sind führe ich es hier nochmal etwas mehr aus:

Das ist ein Dataframe was ich normalerweise empfange:

Sollwert Empfangen:
Raw_Dataframe(SOLL) = b'60-01.00.0015:49:0801.02.2021 31-------- 4 50050---- 0300--- 0-----------------60\r'
Dataframe nach Transformation(SOLL) = ('60', ' 3', '1', ' 4', ' 500', '50', '----', '300', ' 0', '---', ' 0', '----', '---', '---')
Parameter(SOLL) = (4, 500, 50, 300, 0, 0)


Istwert Empfangen(S):
Raw_Dataframe(IST) = b'50A01.00.0015:49:4101.02.2021 311 400100 4 50085---- 0300--- 0-----------------66\r'
Dataframe nach Transformation(IST) = ('50', ' 3', '1', ' 4', ' 500', '85', '----', '300', ' 0', '---', ' 0', '----', '---', '---')
Parameter(IST) = (4, 500, 85, 300, 0, 0)

Die Frames sind natürlich gleich von der Struktur.


Danach vergleiche ich die beiden Parameter bzw. bilde die Differenz der Werte mit:

Code: Alles auswählen

def diff_soll_ist(soll, ist):
    diff = list(map(int.__sub__, soll, ist))
    print("Ist =", ist)
    print("Soll =", soll)
    print("Diff =", diff)
    return diff
    
Im Fall der Soll und Ist Werte welche oben stehen erhalte ich dann:

Differenz = (0, 0, -35, 0, 0 ,0)

Danach erfolgt dann meine Automatische Werteanpassung welche die Werte, welche ungleich 0 sind anpasst.


im Anschluss frage ich dann meinen neuen Istwert ab (an dieser stelle ist dann der Fehler):

Code: Alles auswählen

istwert = get_serial()
hier erhalte ich dann aber kein Protokoll mit 86 Zeichen sondern nur drei Werte:
Was ich da erhalte habe ich mit einer kleinen Modifikation meines alten Codes anzeigen lassen:

Code: Alles auswählen

def get_serial():
    while True:
        data = connection_ist.readline()
        # print(len(data))
        # print(data)
        data_str = str(data)
        # print(data_str[2])
        if len(data) == 86 and data_str[2] == "5":
            istwert = data_str     # Übergabe des Datenstring
            # print("Empfangen(Ist-Wert) =", istwert)
            return istwert
        elif len(data) >= 2:
            empfangen = data_str
            print("Empfangen(Ist-Wert) =", empfangen)
und hier erhält meine Automatisierung dann kein Protokoll sondern bleibt dann "hängen".


@Sirius3 ich hoffe ich konnte mit dieser kleinen Ausführung deutlicher rüberbringen was genau jetzt der fehler bei mir ist.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Es scheint also so zu sein, dass das Protokoll beim Ändern von Werten von dem abweicht, was Du erwartest.
Konsequenz daraus ist, dass Du Dein Programm anpassen mußt, dass es mit diesem Fakt auch umgehen kann. Es sei denn, Du machst beim Ansprechen deines Geräts einen Fehler. Da Du weder das eine noch das andere hier gezeigt hast, kann man Dir da nicht weiter helfen.
Aber entweder das eine oder das andere sollte doch in der Dokumentation der Schnittstelle stehen und Schnittstellen muß man exakt so wie vorgesehen bedienen, jede kleinste Abweichung kann zu undefiniertem Verhalten führen.
Antworten