开篇故事:那个让ECU“失忆”的下午
上个月,我接手一个远程OTA项目,ECU刷写完成后需要回读固件做完整性校验。同事老张按老套路,直接发0x22 F1 90读个CRC32就交差。
结果测试时发现:读回来的CRC和本地计算的完全对不上,但ECU明明刷写成功了。排查了两天,发现是0x35请求上传时,ECU返回的块长度参数被老张当成了“建议值”,实际读回来的数据量比预期少了几个字节——那几个字节正好是CRC校验的“盲区”。
这件事让我意识到:很多人把0x35(请求上传)和0x38(请求文件传输)当作0x34的“逆操作”,觉得“能写就能读”。
但实际工程中,UDS的上传和文件传输服务,藏着比下载更刁钻的坑——因为读数据时,ECU是“甲方”,你作为Tester必须完全服从它的节奏,任何自作主张都可能导致数据错位。
痛点拆解:你以为的“对称操作”全是反例
常见误区1:把0x35当成0x34的镜像
很多人想当然地认为:0x34是“Tester告诉ECU我要写数据”,0x35就是“Tester告诉ECU我要读数据”。错!0x35的请求格式是:
请求:0x35 + 数据格式标识符 + 地址/长度参数
响应:0x75 + 最大块长度 + 数据格式标识符(可选)
关键区别在于:0x34的块长度是Tester主动声明,0x35的块长度是ECU主动给出。你问ECU“我能读多少”,ECU回答“你最多一次读这么多”,然后你必须按照这个“最大块长度”去分割请求




