CAN Bus Frage zu Notifier

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
zmaier
User
Beiträge: 5
Registriert: Dienstag 4. September 2018, 10:21

Hallo,

ich habe am Pi ein HAT mit 2 Bus Channels (can0 und can1). Die Konfiguration passt soweit.

Ich will einen bestehenden CAN-Bus zwischen 2 Knoten auftrennen, die eine Seite hängt an can0, die andere an can1.
Vorerst, sollten einfach alle Nachrichten stur durchgeschliffen werden, also wie wenn die Trennung nicht da wäre. In einem späteren Schritt möchte ich gezielt CAN-Ids manipulieren.

Jetzt die eigentliche Frage, ich weiß nicht wie ich dem notifier die Funktion parser_can0 bzw. 1 übergeben kann? Ich versteh das Konstrukt nicht wirklich.
Wie kann ich eine Funktion definieren die aufgerufen wird wenn am Bus eine Nachricht ankommt?

Analog zu mqtt. dort geht das einfach mittels client.on_message = function_on_message
Könnt ihr mir da weiterhelfen?

sg, DANKE
Martin

Code: Alles auswählen

import can
import time

can0 = can.interface.Bus(channel = 'can0', bustype = 'socketcan_native')
can1 = can.interface.Bus(channel = 'can1', bustype = 'socketcan_native')


def parser_can0():
    message=can.Message
    print(message)
    can1.send(message)

def parser_can1():
    message=can.Message
    print(message)
    can0.send(message)
    
notifier0=can.Notifier(can0,[parser_can0()])
notifier1=can.Notifier(can1,[parser_can1()])
    
while True:
    time.sleep(1)
    print('Do something')
Fehlermeldung:

Code: Alles auswählen

<class 'can.message.Message'>
<class 'can.message.Message'>
Exception in thread can.notifier for bus "socketcan channel 'can1'":
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.7/dist-packages/can/notifier.py", line 102, in _rx_thread
    self._on_message_received(msg)
  File "/usr/local/lib/python3.7/dist-packages/can/notifier.py", line 119, in _on_message_received
    res = callback(msg)
TypeError: 'NoneType' object is not callable
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Fehlermeldung ist doch recht eindeutig: can.Notifier erwartet eine Liste mit aufrufbaren Objekten und None ist nicht aufrufbar.
Außerdem erwartet der Aufruf einen Parameter, die haben die parser_can1/2-Funktionen nicht. can.Message ist nur die Klasse, das ist also wenig sinnvoll damit etwas zu machen. Die beiden Funktionen sind quasi identisch, können also in ein zusammengefasst werden.
Man sollte keine globalen Variablen benutzen.

Code: Alles auswählen

import can
import time
from functools import partial

def parser_can(messsage, other_can):
    print(message)
    other_can.send(message)

def main():
    can0 = can.interface.Bus(channel='can0', bustype='socketcan_native')
    can1 = can.interface.Bus(channel='can1', bustype='socketcan_native')
    notifier0 = can.Notifier(can0, [partial(parser_can, other_can=can1)])
    notifier1 = can.Notifier(can1, [partial(parser_can, other_can=can0)])
        
    while True:
        time.sleep(1)
        print('Do something')

if __name__ == "__main__":
    main()
zmaier
User
Beiträge: 5
Registriert: Dienstag 4. September 2018, 10:21

Danke für die Info, werde ich heute Abend gleich ausprobieren.

Ein Hinweis noch, ich habe diese Frage auch im Raspi-Forum gepostet.
Falls das ein Probleme ist bitte das Thema sofort löschen.

https://forum-raspberrypi.de/forum/thre ... -notifier/

Update: Thema wurde im Raspi-Forum gelöscht.
zmaier
User
Beiträge: 5
Registriert: Dienstag 4. September 2018, 10:21

Hi,

leider meckert er noch, dass message nicht definiert ist?
Eine blöde frage, ich versteh das Konstrukt noch nicht.
Die Funktion parser_can hat 2 Parameter, wo werden die übergeben?

Code: Alles auswählen

Exception in thread can.notifier for bus "socketcan channel 'can1'":
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/local/lib/python2.7/dist-packages/can/notifier.py", line 102, in _rx_thread
    self._on_message_received(msg)
  File "/usr/local/lib/python2.7/dist-packages/can/notifier.py", line 119, in _on_message_received
    res = callback(msg)
  File "fa.py", line 6, in parser_can
    print(message)
NameError: global name 'message' is not defined
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Schau mal auf die Rechtschreibung.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und zur Frage wieso es geht mit den zwei Argumenten, siehe: https://stackoverflow.com/questions/153 ... at-it-does
zmaier
User
Beiträge: 5
Registriert: Dienstag 4. September 2018, 10:21

DANKE!

Da sieht man vor lauter sssss die "message" nicht :)

Thema hat sich erledigt, es läuft.
Schöne Grüße und vielen Dank für die Hilfe.
Antworten