news 2026/5/2 22:16:06

canoe capl写的uds基础代码脚本测试用例 1、10服务和22服务测试用例,拿去参考...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
canoe capl写的uds基础代码脚本测试用例 1、10服务和22服务测试用例,拿去参考...

canoe capl写的uds基础代码脚本测试用例 1、10服务和22服务测试用例,拿去参考,自己搭的发送和接收函数,拿去做做基本的uds测试没问题。 2、节点dtc丢失与恢复测试,19服务读取dtc,验证dtc存在。

最近在折腾UDS诊断测试脚本,顺手整理了点基础测试用例。拿canoe的CAPL撸代码其实挺有意思的,虽然一开始被字节序折腾得够呛。分享两个常用服务的测试套路,直接上硬货。

canoe capl写的uds基础代码脚本测试用例 1、10服务和22服务测试用例,拿去参考,自己搭的发送和接收函数,拿去做做基本的uds测试没问题。 2、节点dtc丢失与恢复测试,19服务读取dtc,验证dtc存在。

先说10服务和22服务这对黄金搭档。会话控制配数据读取,简直就是诊断界的泡面搭档。我习惯把收发函数单独封装,比如这样:

// 发送请求报文 void SendRequest(byte serviceId, byte subFunc, byte dataIdentifer[]) { byte msg[8]; msg[0] = 0x03; // 假设是单帧 msg[1] = serviceId; msg[2] = subFunc; if(serviceId == 0x22) { msg[3] = dataIdentifer[0]; msg[4] = dataIdentifer[1]; } // 发送到总线... } // 接收响应处理 on message 0x732 // 假设响应ID { if(this.byte(0) == 0x03) { // 正响应 if(this.byte(1) == 0x50) { // 10服务响应 write("会话模式切换成功"); } else if(this.byte(1) == 0x62) { // 22响应 parseData(this.byte(3), this.byte(4)); // 解析数据 } } else { // 负响应 handleNRC(this.byte(2)); // 处理错误码 } }

测试10服务的时候重点玩转子服务参数。比如先切默认会话再切编程模式:

testCase("10服务_默认会话") { SendRequest(0x10, 0x01, null); // 等响应 if(getRespCode() != 0x50) { testFail("没切到默认会话"); } } testCase("10服务_编程会话") { SendRequest(0x10, 0x02, null); // 这里可能需要安全访问 if(getRespCode() == 0x7F) { retryWithSecurity(); } }

22服务测试要特别注意数据对齐。比如读取车速0xF40A:

testCase("22服务_读取车速") { byte did[2] = {0xF4, 0x0A}; SendRequest(0x22, 0x00, did); // 假设车速是uint16类型 word speed = (respData[0] << 8) | respData[1]; if(speed > 300) { testWarning("车速数据异常"); } }

再说说DTC测试这个磨人的小妖精。19服务最骚的操作是带状态掩码查询。比如突然拔掉某个节点电源模拟DTC丢失:

// 正常状态读取DTC testCase("19服务_DTC存在") { SendRequest(0x19, 0x0A, null); // 读取所有DTC if(findDTC(0xP1234) == 0) { testFail("该有的DTC没找到"); } } // 断电后检测 testCase("节点DTC丢失") { powerOff(Node_ECU1); delay(1000); SendRequest(0x19, 0x0A, null); if(findDTC(0xP1234) == 1) { testFail("断电后DTC还在?"); } } // 恢复供电后检测 testCase("DTC恢复测试") { powerOn(Node_ECU1); doCyclicDTCUpdate(); // 模拟运行几个循环 SendRequest(0x19, 0x0A, null); if(findDTC(0xP1234) == 0) { testFail("DTC没自动恢复"); } }

这里有个坑要注意:19服务响应的DTC列表是打包成三字节一组,得用位运算拆解:

int findDTC(long searchDTC) { for(int i=0; i<respDataLen; i+=3) { long dtc = (respData[i] << 16) | (respData[i+1] << 8) | respData[i+2]; if((dtc & 0x00FFFF) == searchDTC) { return 1; } } return 0; }

实际测试中发现有些ECU喜欢在DTC状态字节里玩花样,比如0x08表示待处理故障。这时候得把状态掩码玩明白:

byte statusMask = 0x08; // 只关注待处理故障 SendRequest(0x19, 0x0A, &statusMask);

这些测试脚本虽然基础,但足够应付80%的日常验证。特别是新搭环境的时候,拿这几个用例当探针,能快速摸清ECU的响应套路。下次再聊聊用0x2E服务写数据时遇到的玄学问题,那才叫刺激...

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 7:13:37

模型、框架、应用量产工作流,原力灵机三箭齐发,开启具身智能元年

2 月 10 日&#xff0c;以“具身原生”为主题的原力灵机技术开放日在北京中关村展示中心举行。在这场被称为“最硬核的具身产品发布会”上&#xff0c;原力灵机一举发布三大核心产品&#xff1a;全球首个具身原生大模型 DM0、具身原生开发框架 Dexbotic 2.0、以及具身原生应用量…

作者头像 李华
网站建设 2026/5/3 20:46:07

COMSOL固态纳米孔稳态仿真

comsol固态纳米孔稳态仿真深夜的实验台前&#xff0c;咖啡杯沿残留着干涸的褐色痕迹。我盯着屏幕上跳动的收敛曲线&#xff0c;突然意识到纳米孔仿真就像煮泡面——火候差一点就糊锅。COMSOL的模型树此刻在蓝光中闪烁&#xff0c;仿佛在嘲笑我的天真。打开模型树第一件事&#…

作者头像 李华
网站建设 2026/4/28 9:14:31

小白程序员转行AI产品经理的必看实战经验分享

本文分享了作者从计算机专业转行AI产品经理的经历&#xff0c;从投递各大互联网公司受挫&#xff0c;意识到AI产品需求旺盛 背景&#xff1a; &#x1f31f;学历&#xff1a;211硕士 &#x1f31f;****专业&#xff1a;计算机专业 &#x1f31f;****性别&#xff1a;男 &#x…

作者头像 李华
网站建设 2026/4/28 23:07:33

Open-Lovable 克隆网页超实用,搭配 cpolar 远程用更香

Open-Lovable 是一款面向前端开发者的开源工具&#xff0c;核心功能是将任意网页克隆为可编辑的 React 应用&#xff0c;还支持多类 AI 模型辅助生成代码&#xff0c;适配新手学习、中小企业原型开发等场景。它的优点很贴合实际需求&#xff1a;拆分代码组件清晰&#xff0c;保…

作者头像 李华