UDS on CAN的ADAS刷写BootLoader上位机开发

最近受某ADAS企业委托,帮助其开发一款ADAS控制器的BootLoader上位机,采用的设备是Kvaser和USBCAN2,一切都还比较顺利,刷写流程基本也是按照ISO14229-1的标准来做的,修改相关DID和安全算法,整体下来不满打满算大概花了20天左右,符合预期进度。

  • 整体展示

项目整体界面设计长下面这个样子,分了菜单栏、工具栏、文件选择、刷写控制、刷写信息显示、软件操作说明、后台日志几个部分,采用无按钮式设计,保持界面的简洁。

菜单栏包括设备选择,通道选择和波特率设置,可以选择Kvaser和USBCAN2设备,默认USBCAN2,通道为2通道,默认使用1通道,波特率分为250K、500K、1M,默认500K。

工具栏包括启动设备、关闭设备、读ECU软件版本和ECU硬件版本,每次刷写前和刷写后进行软硬件版本获取,及时了解刷写情况。

文件选择部分包括应用文件和驱动文件,应用文件时必须的,驱动文件是可选的,文件类型是S19或hex。

刷写控制主要是启动ECU刷写流程,刷写采用多线程设计,提高刷写的整体效率,同时增加刷写进度条,可以及时了解刷写进度。

刷写信息显示主要是对刷写过程中的阶段进行显示,帮助用户知晓当前刷写的具体进程以及帮助出现问题时的故障排查。

软件操作说明分序号说明软件的具体功能,按箭头指示步骤的进行操作软件,减少软件跨部门使用时的沟通成本。

  • 开发过程

项目采用最新的VS2022进行开发,采用面向对象的方式进行模块化设计,减少模块间的耦合,方便以后增加新的功能模块;另外,采用多线程的方式,将报文接收、界面响应、刷写流程等部分分为线程,异步接收和发送,最大程度的避免由于软件处理不及时导致的丢帧问题,这点在实车测试时显得很重要,也是为什么很多上位机在实验室可以刷写,但在实车环境成功率就非常低。这也是多年测试出来的经验。

刷写流程代码:

//BT执行流程
        public void BTProcess()
        {
            Program.form2.BTprogressBarInit();
            //Program.form2.timer100ms.Enabled = true;
            //3.1 预编程
            if (PreProgramming() == 0)
            {
                //Console.Write("STEP1:预编程失败\r\n");
                Log.WriteToLog("//STEP1:预编程失败\r\n");
                Program.form2.textBox3.Text += string.Format("STEP1:预编程失败\r\n");
                Form2.Timer_3E80.Enabled = false;//停止3E80服务
                                                 //清除显示
                MessageBox.Show("刷写失败", "失败",
                                   MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Program.form2.textBox3.Clear();
                Program.form2.BTprogressBarClear();
                // Program.form2.EableDisableStartBT(true);
                return;
            }
            //Console.Write("STEP1:预编程成功\r\n");
            Log.WriteToLog("//STEP1:预编程成功\r\n");
            Program.form2.textBox3.Text += string.Format("STEP1:预编程成功\r\n");
            Program.form2.BTprogressBarAdd(5);
            //3.2主编程

            if (MainProgramming() == 0)
            {
                //Console.Write("STEP2:主编程失败\r\n");
                Log.WriteToLog("//STEP2:主编程失败\r\n");
                Program.form2.textBox3.Text += string.Format("STEP2:主编程失败\r\n");
                Form2.Timer_3E80.Enabled = false;//停止3E80服务
                MessageBox.Show("刷写失败", "失败",
                                  MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Program.form2.textBox3.Clear();
                Program.form2.BTprogressBarClear();
                //Program.form2.EableDisableStartBT(true);
                return;
            }

            //Console.Write("STEP2:主编程成功\r\n");
            Log.WriteToLog("//STEP2:主编程成功\r\n");
            Program.form2.textBox3.Text += string.Format("STEP2:主编程成功\r\n");
            //3.3后编程
            if (PostProgram() == 0)
            {
                //Console.Write("STEP3:后编程失败\r\n");
                Log.WriteToLog("//STEP3:后编程失败\r\n");
                Program.form2.textBox3.Text += string.Format("STEP3:后编程失败\r\n");
                Form2.Timer_3E80.Enabled = false;//停止3E80服务
                MessageBox.Show("刷写失败", "失败",
                                  MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Program.form2.textBox3.Clear();
                Program.form2.BTprogressBarClear();
                //Program.form2.EableDisableStartBT(true);
                return;
            }
            //Console.Write("STEP3:后编程成功\r\n");
            Log.WriteToLog("//STEP3:后编程成功\r\n");
            Program.form2.textBox3.Text += string.Format("STEP3:后编程成功\r\n");

整个刷写速度的话,360K的hex文件大概17S刷写完毕。

界面的设计比较简洁,干技术的审美也只能这样,大家不要吐槽,取消了按钮式的选择和操作方式,整体效果偏蓝色,启动和关闭设备借鉴了CANoe的按钮,各个部分进行分割,然后就成了现在这个样子。

开发过程遇到的最大问题来源于自己的误操作,当时在调试USBCAN2的时候,由于这个盒子自带终端电阻,自己非常好奇这个终端电阻能不能用,然后就把终端电阻的开关打开了,当时整个下午都用起来非常顺畅,然后,到了晚上的时候,重新打开电脑开始调试,发现这个设备的驱动自己就掉线了,然后自己就开始了一路装驱动、重启电脑、卸载驱动的悲催循环,然后设备死活用不了,就在快要崩溃的时候,躺在床上发呆,为什么最开始拿到设备的时候可以用,现在突然用不了了呢,为什么,这两个时间点我对设备做了什么操作,想着想着,突然灵光一现,我好像动了设备的终端电阻开关,然后马上跳下床,把开关关了,插上电脑再试,电脑它终于识别到这个设备,一个小小的电阻开关,白搞了整整一个晚上,至于为什么电阻开关打开后驱动就用不了了,这个实在没想通!

开发指导放在GitHub了,GitHub - sydyg/UDS-on-Bootloader

希望对有相似需求的有帮助。

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南山墨客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值