老张上周遇到一个头疼的问题:他用0x34服务成功和ECU握手后,开始用0x36传输固件数据。
结果传输到一半,ECU突然回复0x7F 0x36 0x31(请求超出范围),然后整个刷写流程直接中断。他翻遍日志,发现每次都在传输第47个数据块时崩溃——而他的块大小明明是按照0x34返回的MaxNumberOfBlockLength设置的。
“我严格按照协议来的啊,为什么ECU翻脸不认人?”老张在电话里抱怨。
我让他把代码和数据发过来,一看就发现了问题:他确实设置了块大小,但每次发送的数据块之间没有等待ECU处理完成,导致ECU的接收缓冲区溢出。
这就是典型的“流水线堵车”——数据来得太快,ECU消化不了。
痛点拆解:你以为的“流水线”其实是“推土机”
常见错误1:连续发送不等待
很多工程师认为0x36就是简单地把数据按块切分,然后for循环发送。比如这样:
# 错误示例:连续发送不等待
def transfer_data_bad(session, data