cantools在解析dbc方面于python与c语言领域的使用

一、什么是cantools。
答:一个can总线的python工具库。包含的功能也比较丰富。除了在实时解析can信号方面有应用,在c语言中也有应用,它可以预解析dbc文件并生成.c .h文件(包含message结构体,解析移位方法等)

二、安装。

python3 -m pip install cantools

三、使用。
1、在线解析。

>>> 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)]

2、dbc文件预解析,生成C代码。

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

python -m cantools  generate_c_source -e "gb18030" xxx.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-32\Lib\site-packages\cantools

compat.py

cantools在解析dbc方面于python与c语言领域的使用_第1张图片

将replace改成ignore

问题解决

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

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

void CAN_DECODE::decode_func_mdr(ZCAN_ReceiveFD_Data canfd_data, ZCAN_Receive_Data can_data)
{
	msg_t _struct;
	if (canfd_data.frame.can_id == 0x000)
	{
		msg_unpack(&_struct, (uint8_t *)(&canfd_data.frame.data), canfd_data.frame.len);
		_struct.signal= signal_decode(_struct.signal_value);

你可能感兴趣的:(python+can,python,c++)