背景:偶然得知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);



