功能请求场景下CAPL的testWaitForDiagResponse函数失效问题咨询
问题:功能请求场景下CAPL的testWaitForDiagResponse函数失效
问题现象
当使用功能地址发送诊断请求时,调用testWaitForDiagResponse后返回值u32Result为0(超时),但实际ECU已发送响应。
相关代码
diagRequest STDS_RQ Dummy_Req_Obj; long u32RespCode; u32RespCode = diagSendRequest(Dummy_Req_Obj); // Send the request if(0 == u32RespCode) { u32RespCode = testWaitForDiagRequestSent(Dummy_Req_Obj,150000); if(u32RespCode == 0){...} if(u32RespCode == 1) { u32Result = testWaitForDiagResponse(Dummy_Req_Obj, 55); //u32Result is 0,but the ECU send response ... } ... }
地址配置
- 物理地址请求ID:
7F1 - 物理地址响应ID:
7F9 - 功能地址请求ID:
7DF
原因分析
testWaitForDiagResponse默认匹配诊断对象绑定的响应ID。如果诊断数据库中Dummy_Req_Obj仅配置了物理地址响应ID(7F9),而功能地址请求对应的ECU响应ID应为7DF + 8 = 7E7,函数无法识别未绑定的响应ID,就会判定超时返回0。
解决方案
更新诊断数据库配置:
在诊断数据库(.dbc/.cdb)中,给Dummy_Req_Obj添加功能地址对应的响应ID(7E7),让函数能匹配到功能请求的响应。使用
testWaitForDiagResponseMatching替代:
该函数可直接指定要匹配的响应ID,无需依赖诊断对象的绑定配置,示例代码:// 显式指定匹配功能地址响应ID 0x7E7 u32Result = testWaitForDiagResponseMatching(Dummy_Req_Obj, 0x7E7, 55);确认请求地址模式:
发送请求前显式设置功能地址,确保请求以功能模式发送:diagSetTargetAddress(Dummy_Req_Obj, 0x7DF); // 设置功能请求目标地址
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

