上回咱们聊完了0x36传输数据,你学会了如何用序列号递增+动态块大小构建一条可靠的数据流水线。
但数据发完只是第一步——ECU收到最后一块数据后,会做什么?它会说“OK,我收完了”,还是“校验和不匹配,重来”?这就是0x37请求退出传输要解决的问题。
先讲个真实故事。去年我调试一个OTA升级项目,每次传完数据ECU都回复0x77(正确响应),但到了刷写阶段却报错“数据损坏”。
我反复检查0x36的序列号和块大小,都没问题。后来才发现,0x37请求里我忘了带校验和——ECU虽然收完了数据,但无法确认完整性,最终在内部校验时发现了错误。这个坑,让我理解了0x37的“收尾”工作远不止发一条指令那么简单。
痛点拆解:你以为发完0x36就结束了?
常见错误1:0x37只发个空请求
很多新手以为0x37就是告诉ECU“我发完了”,然后ECU就该乖乖回复肯定应答。实际上,0x37请求必须携带校验和(Checksum),而且是整个传输数据(0x34到0x36所有数据)的校验结果。
反例代码:
def send_0x37_wrong(uds_client)


