开篇故事
上周,老张在实验室急得直跺脚——他写好的刷写工具,明明能正常进入编程会话(0x10 02),也能通过0x27安全访问,可一到0x34请求下载就翻车。
ECU要么返回NRC 0x13(消息长度错误),要么直接静默不理。更要命的是,同样的代码在A供应商的ECU上跑得溜,换到B供应商的ECU就罢工。
“我查了三天,最后发现是0x34的memoryAddress和memorySize参数没对齐ECU的内存对齐要求,而且没处理ECU返回的0x74扩展响应。”
老张苦笑着递给我他的调试日志,“0x34这步,比我想象的讲究多了。”
痛点拆解
常见错误1:把0x34当成“一次性握手”
很多新手以为0x34就是发个请求、等个正响应完事。实际上,ECU可能因为多种原因拒绝你,比如:
- memoryAddress不合法(比如写到只读区域)
- memorySize超出范围(你申请了1MB,但ECU的Flash只剩512KB)
- 长度与ECU内部块大小不匹配(比如ECU要求4字节对齐,你给了7字节)
反例代码(典型的“撞墙”写法)
def request_download_wrong