【问题标题】:How to decode message from a canbus (Iptronik)如何解码来自 can bus (Ipetronik) 的消息
【发布时间】:2019-10-09 14:27:16
【问题描述】:

我从 canbus 检索以下消息和信号数据(来自 Iptronik sim stg 机器)。我用 python 编码,我使用 python-can 库,我有 ubuntu 18.04

检索到的消息/信号:

Timestamp: 1570622811.311113        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 04 00     Channel: can0
Timestamp: 1570622811.811173        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 0f 06     Channel: can0
Timestamp: 1570622812.311224        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 65 1a     Channel: can0
Timestamp: 1570622812.811266        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 47 0c     Channel: can0
Timestamp: 1570622813.311266        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 2c 58     Channel: can0
Timestamp: 1570622813.811316        ID: 0060    S                DLC:  8    e4 7f 55 55 55 55 20 36     Channel: can0

从 dbc 文件我有这个信息。

BO_ 96 DEVICE_51900450_0: 8 C_51900450
  SG_ Beschleunigung : 0|16@1+ (0.000152590218966964,-5) [-5|5] "V" IPETRONIK_CAN_1
  SG_ Pos : 48|16@1+ (0.000152590218966964,0) [0|10] "V" IPETRONIK_CAN_1

当我转换为前 4 位和最后 4 位时,我得到的这个数字与 dbc 文件不对应。

(228, 127, 3, 0)
(228, 127, 3, 0)
(228, 127, 62, 3)
(228, 127, 162, 16)
(228, 127, 143, 28)
(228, 127, 252, 93)

您能否帮助我或给我一些建议,以根据 dbc 说明正确转换信号。 提前谢谢你:)

【问题讨论】:

    标签: python embedded can-bus


    【解决方案1】:

    这可能对你有帮助...

    import cantools
    import can
    from pprint import pprint 
    
    db = cantools.database.load_file('******_dbc.dbc') #path of .dbc file
    print( db.messages)
    can_bus = can.interface.Bus('can0', bustype='socketcan')
    message = can_bus.recv()
    for msg in can_bus:
         print ( db.decode_message(msg.arbitration_id, msg.data))
    

    【讨论】:

      【解决方案2】:

      您可以使用 CAN BUS 工具 (https://cantools.readthedocs.io/en/latest/) 加载您的 .DBC 文件并正确解码您的 CAN 消息:

      pip install cantools
      

      示例代码如下:

      >>> import cantools
      >>> from pprint import pprint
      >>> db = cantools.database.load_file('tests/files/dbc/motohawk.dbc')
      >>> db.messages
      [message('ExampleMessage', 0x1f0, False, 8, 'Example message used as template in MotoHawk models.')]
      >>> example_message = db.get_message_by_name('ExampleMessage')
      >>> pprint(example_message.signals)
      [signal('Enable', 7, 1, 'big_endian', False, 1.0, 0, 0.0, 0.0, '-', False, None, {0: 'Disabled', 1: 'Enabled'}, None),
       signal('AverageRadius', 6, 6, 'big_endian', False, 0.1, 0, 0.0, 5.0, 'm', False, None, None, ''),
       signal('Temperature', 0, 12, 'big_endian', True, 0.01, 250, 229.53, 270.47, 'degK', False, None, None, None)]
      

      【讨论】:

      • 谢谢你让我走上了正轨。我在文档示例中找到了解码信号。
      【解决方案3】:

      在 python 中有这个很棒的库https://pypi.org/project/cantools/

      您可以通过它的源代码找到需要提取的字段:https://github.com/eerimoq/cantools/tree/f120d35e1523201b6d87e87306457bf1769330e3

      消息和信号的所有相关字段都可以在此 github 链接的 cantools/database/can/message.py 和 /database/can/signal.py 中找到

      例如:如果您需要信号的名称和单位,您可以使用 signal.name 和 signal.unit

      提取这些字段的示例代码:

       #**dbc_file** is the full path of dbc 
          db = cantools.database.load_file(dbc_file)
          for msg in db.messages:
              msg_name = msg.name
              msg_id = msg.frame_id
              msg_length = msg.length
              sender = msg.senders
              msg_group = db.get_message_by_name(msg_name)
          
              for signal in msg_group.signals:
                  
                  #name of signal
                  sig_name = signal.name
                  #unit of signal
                  sig_unit = signal.unit
      

      希望这对某人有所帮助!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 2013-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多