老张上周差点把客户的ECU刷成砖。他按着旧文档,先发0x34请求下载,然后一股脑把2MB的固件用0x36扔过去,结果ECU直接NRC 0x78(请求正确接收-响应待定),然后超时沉默——因为0x34返回的“最大数据长度”只有256字节,他压根没检查。
“我以为下载就是‘请求-发送-结束’三步走。”老张苦笑。我拍拍他肩膀:“你缺的不是步骤,是理解这三条服务的‘握手协议’——它们不是独立的,而是一个带流量控制的会话。”
今天,我们就来拆解0x34(请求下载)、0x36(传输数据)、0x37(请求退出传输)这三兄弟的协作逻辑,让你刷写固件时像老司机一样稳。
痛点拆解:常见错误实现与认知误区
误区一:忽略0x34返回的“最大数据长度”
很多新手以为0x34只是“告诉ECU我要下载”,然后直接按自己意愿分包发送。实际上,0x34的正响应(0x74)会返回两个关键参数:maxNumberOfBlockLength(最大块长度)和memorySize(分配的内存大小)。如果你无视这个长度,ECU可能直接拒绝后续的0x36请求。
反例代码(错误实现):
# 错误:未检查0x34返回的最大块长度
def download_firmware_wron