栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

利用python的cantools解dbc并生成.c和.h文件,decode can通信

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用python的cantools解dbc并生成.c和.h文件,decode can通信

背景:偶然得知cantools不仅仅有对python实时解析的支持,也可以解析dbc文件生成.c .h文件用于

C或者C++项目的二次开发,用于解析can通信,收发皆可。实际使用过程中,在cmd窗口用如下命令进行解析

python -m cantools generate_c_source -e “gb18030” JAC_MDR.dbc

现象:实际总是会产生如下报错

error: ‘gbk’ codec can’t encode character ‘ufffd’ in position 1103370: illegal multibyte sequence

原因:首先这是由编码格式与文件不一致造成的,其间也换成了utf-8和其他的gbk格式,

但是一直都有这个报错

解决:

正常python在读取文件的操作为:

fp = open(self._filename, 
self._mode, 
encoding=self._encoding, 
newline=self._newline,
errors='replace')​​

在这里errors这个参数如果改成ignore,就可以忽略这些编码错误,正常读取了,亲测读取后不会影响使用。

所以在cantools源码下

D:Python37-32Libsite-packagescantools

compat.py

将replace改成ignore

问题解决

后续加载.c .h文件 ,先创建结构体

然后将can信号unpack,最后再decode部分signal即可取值。发送信号则先encode,再pack。
举例:

void CAN_DECODE::Radar_Auxiliary_decode_mdr(ZCAN_ReceiveFD_Data canfd_data, ZCAN_Receive_Data can_data)
{
	jac_mdr_radar_auxiliary_msg_t auxiliary_struct;
	if (canfd_data.frame.can_id == 0x000)
	{
		jac_mdr_radar_auxiliary_msg_unpack(&auxiliary_struct, (uint8_t *)(&canfd_data.frame.data), canfd_data.frame.len);
		Radar_Auxiliary_0.radar_framecnt = jac_mdr_radar_auxiliary_msg_frame_counter_radar_aux_decode(auxiliary_struct.frame_counter_radar_aux);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1021913.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号