kleines Python-Can Problem

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
wese
User
Beiträge: 5
Registriert: Mittwoch 15. März 2017, 21:25

Hallo,

Ich spreche mit Hilfe von Python-can mehre Bus-Geräte an, durch das Senden des Befehls in "Write_Msg" antworten
alle angeschlossenen Bus-Geräte mit ihrer jeweiligen Adresse und über das iterierbare Busobjekt kann ich die
Empfangnen Daten anzeigen lassen. Das Problem ist nun wenn alle Daten per Print ausgegeben wurden, läuft die
for schleife endlos weiter. Die Frage wäre nun ob sich die Daten auch ohne For-Schleife einzeln auslesen lassen, ich
habe dabei schon ein paar Dinge ausprobiert aber ich verstehe noch nicht ganz wie das mit dem iterierbare Bus-objekt genau
funktioniert.

Für etwas Hilfe wäre ich sehr dankbar.

Gruß Uli

Code: Alles auswählen

#!/usr/bin/env python3

import can

bus = can.interface.Bus(channel='can0', bustype='socketcan_native')
Write_Msg = can.Message(arbitration_id=0x012, data=[0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], extended_id=False) 
bus.send(Write_Msg)

for msg in bus:
    print(msg)
    
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@wese: ich verstehe nicht ganz, was Du erreichen willst. Die Nachrichten kommen nacheinander am BUS an, und in der Reihenfolge kannst Du sie auch über das iterierbare bus-Objekt auch abfragen. Du kannst aber Filter setzen, wenn Dir das weiterhilft.
wese
User
Beiträge: 5
Registriert: Mittwoch 15. März 2017, 21:25

Hallo,

Ja wenn ich sie per for-schleife abfrage kann ich die Datenpakete auslesen bis keine Bus-Nachricht mehr vorhanden
ist danach bleibt er aber in dieser for-schleife gefangen, sie beendet komischerweise nicht.

Filter benötige ich keinen, ich möchte nur alle Pakete einzeln auslesen.

gruß Uli
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Er wartet halt auf die nächsten Daten. Das löst man normalerweise mit einem Datenpaket, das einen Code für das Ende der übermittelten Nachricht enthält. Darauf müsstest du halt prüfen. Außerdem könnte man ein Timeout mitgeben für den Fall, dass keine neuen Pakete mehr ausgeliefert werden.

Natürlich lässt sich dies schön abstrahieren, sodass man eine typische `for`-Schleife hat, die selbst "weiß", wann sie beendet ist:

Code: Alles auswählen

def get_packages(bus):
    for package in bus:
        if package == STOP_CODE:
            break
        yield package
Oder noch einfacher:

Code: Alles auswählen

packages = iter(bus.recv, STOP_CODE)
Sicherlich angepasst, da es ja offenbar um Pakete und nicht um einzelne Bytes geht.
Antworten