CAN总线 CAN通信 excel dbc相互转换 互转系统 实现功能:excel与dbc文件相互转化,即excel可以转化成dbc,dbc文件可以转换成excel。 编写软件:matlab 2017b GUI 软件界面,dbc文件及excel如图所示。 提供matlab.fig .m源文件
最近在折腾CAN总线协议栈开发,发现DBC文件和Excel表格来回转换是个高频刚需。汽车电子工程师手里攥着几十个CAN信号定义表,手动维护DBC文件简直能让人敲碎键盘。于是用Matlab GUI撸了个互转工具,实测转化速度比某商用软件快3倍,今天把核心实现扒开看看。
系统架构分三大模块:DBC解析器、Excel适配器、数据映射引擎。界面布局参考了VSCode的双栏设计(见图),左侧是文件操作区,右侧用表格控件动态显示解析结果,中间用了个骚气的渐变蓝转换按钮。
先看DBC转Excel的核心代码段:
function dbc2excel_Callback(hObject, ~) [file,path] = uigetfile('*.dbc'); if isequal(file,0) return; end dbcObj = canDatabase(fullfile(path,file)); % 调用CAN工具箱解析DBC signals = vertcat(dbcObj.Messages.Signals); dataCell = [{'Name','StartBit','Length','Factor','Offset','Min','Max','Unit'}; cellfun(@(x){x.Name,x.StartBit,x.Length,x.Factor,x.Offset,... x.Minimum,x.Maximum,x.Unit}, num2cell(signals), 'UniformOutput',0)]; xlswrite('output.xlsx', dataCell); % 注意老版本MATLAB的写表坑 msgbox('转换完成,数据已保存至output.xlsx'); end这段代码有几个魔鬼细节:vertcat纵向拼接时要求结构体字段完全一致,所以原始DBC里如果有信号缺失某些属性会报错。解决方法是用try-catch包裹后自动补默认值,像这样处理Min/Max:
try minVal = signal.Minimum; catch minVal = -inf; % 捕获未定义最小值的情况 endExcel转DBC更刺激,得处理用户随意修改的表格格式。用正则表达式清洗数据:
cleanStr = regexprep(rawStr, '[^a-zA-Z0-9_]', ''); % 干掉非法字符 if length(cleanStr) > 32 cleanStr = cleanStr(1:32); % 遵守CAN信号名长度限制 end最麻烦的是位序计算,用户可能在Excel里乱填StartBit。算法里用了Intel格式自动纠偏:
function startBit = calcStartBit(byteOrder, startByte, bitPos) if strcmp(byteOrder, 'Intel') startBit = (startByte-1)*8 + bitPos; else startBit = (startByte-1)*8 + (7 - bitPos); % Motorola格式魔改 end end实测发现80%的转换错误来自Excel单元格格式不统一。比如有人把Factor写成"0.1",有人写成".1",解决方案是预处理时统一转字符串再转数值:
numVal = str2double(regexprep(cellVal, '^\.', '0.')); % 处理.5这种写法项目里还藏了个彩蛋:按住Shift点击转换按钮会触发批量模式,自动遍历文件夹下所有DBC文件。这个隐藏功能被测试组的兄弟发现后,他们处理200+车型配置的时间从2小时缩到5分钟。
源码包里有几个实用函数值得细品:
- autodbcsyntax_check.m:用有限状态机验证DBC语法
- excelformatlock.m:通过样式锁定Excel模板的关键列
- signalcollisiondetect.m:检测信号名/ID冲突的哈希算法
工具上线半年后收到反馴,某新能源车厂用这玩意儿搞出了骚操作——把Excel表格接入CI系统,每晚自动生成DBC触发自动化测试。果然工程师的创造力比代码更精彩,这大概就是工具开发最爽的时刻吧。