Python CAN总线通知程序

Python CAN总线通知程序,python,raspberry-pi,can-bus,Python,Raspberry Pi,Can Bus,我正试图连接到我汽车的CAN总线。连接正常,数据正在打印到终端,没有任何问题 bus = can.interface.Bus("can0", bustype="socketcan") notifier = can.Notifier(bus, [can.Printer()]) 我正在使用Pyton Can 2.2和python 3.7 我想在can.dlc上添加一个带有某种switch case语句的新侦听器。下面的伪代码是最好的方法吗 import can def parse_data(ca

我正试图连接到我汽车的CAN总线。连接正常,数据正在打印到终端,没有任何问题

bus = can.interface.Bus("can0", bustype="socketcan")
notifier = can.Notifier(bus, [can.Printer()])
我正在使用Pyton Can 2.2和python 3.7

我想在can.dlc上添加一个带有某种switch case语句的新侦听器。下面的伪代码是最好的方法吗

import can

def parse_data(can):
    SingleCanFrame = can.Message
    print(SingleCanFrame)
    if SingleCanFrame.arbitration_id == 304:    #car voltage
        #convert data 
        #save to DB table 1
    elif SingleCanFrame.arbitration_id == 400:  #car speed
        #convert data 
        #save to DB table 2
    elif SingleCanFrame.arbitration_id == 401:  #car tachometer
        #convert data 
        #save to DB table 3
    else:
        #save to DB errorlog

bus = can.interface.Bus("can0", bustype="socketcan")    
notifier = can.Notifier(bus, [parse_data(can)]) 
编辑1: 忘记参数:def parse_data(can

编辑2: 新代码

import can

CAR = {"voltage": 304, "speed": 400, "tachometer": 401}

def cellvoltage(SingleCanFrame, MyDB):
    #convert data 
    #save to DB table 1
def packcurrent(SingleCanFrame, MyDB):
    #convert data 
    #save to DB table 2
def tachometer(SingleCanFrame, MyDB):
    #convert data 
    #save to DB table 3

def parse_data(can):
    SingleCanFrame = can.Message
    MyDB = SomeDB.Connect()
    print(SingleCanFrame)
    if SingleCanFrame.arbitration_id == CAR["voltage"]: #car voltage
        cellvoltage(SingleCanFrame, MyDB)
    elif SingleCanFrame.arbitration_id == CAR["speed"]: #car speed
        packcurrent(SingleCanFrame, MyDB)
    elif SingleCanFrame.arbitration_id == CAR["tachometer"]:    #car tachometer
        tachometer(SingleCanFrame, MyDB)
    else:
        #save to DB errorlog

bus = can.interface.Bus("can0", bustype="socketcan")    
notifier = can.Notifier(bus, [parse_data(can)]) 

基本上,这是一个很好的方法

但是,如果您想更清楚地表达您的意图,词典将非常有用:

CAR = {"voltage": 304, "speed": 400, "tachometer": 401} # capital var name as this a constant var

如果SingleCanFrame.dlc==CAR[“voltage”]:,那么您可以将这些值引用为
,这样更不容易出错。

字典确实是一种很好的方法。将功能进一步拆分为功能有意义吗?我需要更多的上下文来说明“功能”和“功能”。尽管经验法则是,任何可重用的代码或将通过微小更改重用的代码都应该放在一个函数中,“转换数据”和“保存到DB表”可以作为候选函数。dlc是介于0和8之间的数据长度代码。瞧,对不起,我是说仲裁证