CAN通讯进阶-基于Python使⽤dbc⽂件解析CAN数据(dbc⽂件的创建、使⽤⽅
法)
CAN通讯进阶-基于Python使⽤DBC⽂件解析CAN数据
配置环境
使⽤环境:python3.6
平台:Windows10
IDE:PyCharm
1.环境配置
1.1安装CAN通讯需要的包
pip install canlib
1.2 安装kvaser_drivers以及Kvaser CanKing
下载下来之后的⽂件是这样的,三个⽂件依次双击安装就⾏了
安装完后,在开始栏可以查看到已经安装好了
2.使⽤DBC⽂件解析CAN帧2.1DBC⽂件
DBC是Database Can的缩写,其代表的是CAN的数据库⽂件,在这个⽂件中把CAN通讯的信息定义的⾮常完整清楚,在Windows下其存在的格式便是dbc,如图所⽰:
有了DBC⽂件便可以对接收到的CAN帧进⾏解析,分析⼀系列CAN帧代表的真实物理含义。
正因为如此,每⼀个DBC⽂件都对应着⼀种CAN帧的规则,使⽤CAN作为通讯⼿段的设备(如汽车中发动机、车灯、车载空调等等)都有对应的DBC⽂件。
2.2本博客布局
本博客将从DBC⽂件的创建、使⽤DBC⽂件发送指定格式的CAN数据、使⽤DBC⽂件解析接收到的CAN数据来展开。
3.DBC⽂件的创建
3.1创建DBC⽂件代码
# author:Hurricane
# date: 2021/4/16
# File : CAN_Create_Database.py
# E-mail:hurri_cane@qq
import argparse
from collections import namedtuple
from canlib import kvadblib
Message = namedtuple('Message','name id dlc signals')
Signal = namedtuple('Signal','name size scaling limits unit')
EnumSignal = namedtuple('EnumSignal','name size scaling limits unit enums')
_messages =[
Message(
name='EngineData',
id=100,
dlc=8,
signals=[
Signal(
name='PetrolLevel',
size=(24,8),
scaling=(1,0),
limits=(0,255),
unit="l",
)
,
Signal(
北京联通积分兑换name='EngPower',
size=(48,16),
scaling=(0.01,0),
limits=(0,150),
unit="kW",
),
Signal(
name='EngForce',
size=(32,16),
scaling=(1,0),
limits=(0,0),
unit="N",
),
EnumSignal(
name='IdleRunning',
size=(23,1),
unit="",
enums={'Running':0,'Idle':1},
),
Signal(
name='EngTemp',
size=(16,7),
scaling=(2,-50),
limits=(-50,150),
unit="degC",
),
Signal(
name='EngSpeed',
size=(0,16),
scaling=(1,0),
limits=(0,8000),
unit="rpm",
),
]),
Message(
name='GearBoxInfo',
id=1020,
dlc=1,
signals=[
Signal(
name='EcoMode',
size=(6,2),
scaling=(1,0),
美国留学必备用品limits=(0,1),
unit="",
),
EnumSignal(
name='ShiftRequest',
size=(3,1),
scaling=(1,0),
limits=(0,0),
关于爱情的格言unit="",
enums={'Shift_Request_On':1,'Shift_Request_Off':0}, ),
EnumSignal(
name='Gear',
size=(0,3),
抬的拼音山区支教scaling=(1,0),
limits=(0,5),
unit="",
enums={
'Idle':0,
'Gear_1':1,
'Gear_2':2,
'Gear_3':3,
'Gear_4':4,
'Gear_5':5,
},
),
]),
]
def create_database(name, filename):
db = kvadblib.Dbc(name=name)
for _msg in _messages:
message = db.new_message(
name=_msg.name,
)
for _sig in _msg.signals:
if isinstance(_sig, EnumSignal):
_type = kvadblib.SignalType.ENUM_UNSIGNED
_enums = _ums
else:
_type = kvadblib.SignalType.UNSIGNED
_enums ={}
name=_sig.name,
type=_type,
byte_order=kvadblib.SignalByteOrder.INTEL,
mode=kvadblib.SignalMultiplexMode.MUX_INDEPENDENT,
size=kvadblib.ValueSize(*_sig.size),
scaling=kvadblib.ValueScaling(*_sig.scaling),
limits=kvadblib.ValueLimits(*_sig.limits),
unit=_sig.unit,
enums=_enums,
)
db.write_file(filename)
db.close()
if __name__ =='__main__':
parser = argparse.ArgumentParser(
description="Create a database from scratch.")
parser.add_argument('--filename', default=r'..\engine_example.dbc',help=(
"The filename to save the database to."))
致敬2020清明祭英烈寄语parser.add_argument('-n','--name', default='Engine example',help=(
"The name of the database (not the filename, the internal name."))
args = parser.parse_args()
create_database(args.name, args.filename)
3.2使⽤⽅法
代码中if __name__ == '__main__':下:
parser.add_argument('--filename', default=r'..\engine_example.dbc',help=(
"The filename to save the database to."))
指定的filename为创建的DBC⽂件的路径以及⽂件名,本代码中便是将DBC⽂件存在代码所在⽬录的上层⽬录中,以engine_example.dbc⽂件名保存
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论