网站开发 去哪里找页面,网站建设维护一年费用,最大的外包公司有哪些,网站制作公司 沈阳缘起
在新能源车辆的开发和维护中#xff0c;经常需要对CAN总线数据进行分析。CANOE等总线软件虽然方便#xff0c;但功能有限#xff0c;难以满足数据分析的要求。Matlab的Vehicle Network Toolbox可以方便的进行数据解析和分析#xff0c;它是闭源且收费的。因此#x…缘起
在新能源车辆的开发和维护中经常需要对CAN总线数据进行分析。CANOE等总线软件虽然方便但功能有限难以满足数据分析的要求。Matlab的Vehicle Network Toolbox可以方便的进行数据解析和分析它是闭源且收费的。因此使用Python解析CAN总线并进行分析就十分必要。
Python的CAN总线库
Python处理CAN总线的库主要有python-can和cantools。这里我的CAN总线数据保存为asc格式database保存为dbc格式。
from can import ASCReader
from cantools.database import load_file# 我的数据
asc_path xx.asc
dbc_path xx.dbc# 读取dbc文件
database load_file(dbc_path) # 变量database的数据类型cantools.db.can.database.Databasecantools.database.load_file(filename: StringPathLike,database_format: Optional[str] None,encoding: Optional[str] None,frame_id_mask: Optional[int] None,prune_choices: bool False,strict: bool True,cache_dir: Optional[str] None,sort_signals: utils.type_sort_signals utils.sort_signals_by_start_bit,) - Union[can.Database, diagnostics.Database]:
可以读取以下5种不同类型的Database文件----------------------------| Extension | Database format || .arxml | arxml |----------------------------| .dbc | dbc |----------------------------| .kcd | kcd |----------------------------| .sym | sym |----------------------------| .cdd | cdd |----------------------------| unknown | None |----------------------------
要注意它们默认的编码格式是不同的当然你也可以指定编码格式------------------------------------| Database format | Default encoding || arxml | utf-8 |------------------------------------| dbc | cp1252 |------------------------------------| kcd | utf-8 |------------------------------------| sym | cp1252 |------------------------------------| cdd | utf-8 |------------------------------------| None | utf-8 |------------------------------------与之效果相同的读取方法
第一种cantools.db.can.database.add_dbc_file(filename: StringPathLike,encoding: str cp1252) - None: db cantools.database.Database() db.add_dbc_file(foo.dbc)第二种cantools.db.can.database.add_dbc_string(string: str) - None: db cantools.database.Database() with open (foo.dbc, r) as fin:... db.add_dbc_string(fin.read())值得注意的是以上两种方法可以在原有database上增加如 db cantools.database.Database() db.add_dbc_file(foo1.dbc) db.add_dbc_file(foo2.dbc)
这里的db就包含了foo1.dbc和foo2.dbc两个dbc文件的信息。
如果两个dbc有ID相同的报文则后面添加的dbc会覆盖前面id相同的报文。
# 读取asc文件
asc ASCReader(asc_path) # 注意asc是一个迭代器can.ASCReader类
ASC日志文件中CAN消息的迭代器。元数据comments总线统计、J1939传输协议消息被忽略。
接收参数
file: Union[StringPathLike, TextIO]
base: str hex
relative_timestamp: bool True# 使用DBC逐行解析报文
for msg in asc:msg_id msg.arbitration_id # 获取这帧报文的idmsg_data msg.data # 获取这帧报文的原始数据message dbc.decode_message(msg_id,msg_data) # 将报文的id和原始数据传入dbc进行解析获得真实数据print(message)cantools.db.can.database.Database包含CAN网络的所有报文、信号和定义是我们经常会用到的一个类。
cantools.db.can.database.Database常用的类属性有messagesnodes和buses分别返回所有报文的list所有节点的list和所有总线的list。如果想查看某个报文则可以使用.get_message_by_frame_id()或.get_message_by_name() dbc_path xx.dbcdb cantools.database.load_file(dbc_path)db.messages
[message(msg1, 0x18ffffff, True, 8, None), message(smg2, 0x18000000, True, 8, None)]# 通过id检索db.get_message_by_frame_id(0x18ffffff)
message(msg1, 0x18ffffff, True, 8, None)# 通过名称检索db.get_message_by_name(msg1)
message(msg1, 0x18ffffff, True, 8, None)参考
Python-can 4.3.0 documentation
cantools 39.4.1.dev1gcb2c7cf documentation