LANE PILOT

Field note

A late OK from the ELM327: one answer behind, phantom modules

On a 2015 Prius a slow adapter's late OK was read as the car's answer to 01 00. The scan reset the adapter and counted modules that never replied.

By Reed, a technician with 17 years in the bay ·

2015 Toyota Prius · 2013 MINI R56

A scan tool talking through an ELM327-style adapter has to match every reply to the command it belongs to, and the simple way is to take whatever arrives next as the answer to the command just sent. That works until the adapter answers late. Then every reply after that point belongs to the command before it, and the tool starts drawing conclusions from the wrong answers. This note shows the exact moment it happened on two cars, and the one rule that untangles it.

The 2015 Prius: a healthy car, an adapter reset for no reason

The adapter on this scan was slow. The Bluetooth connection took 12 seconds, ATZ took 1.2 seconds, and ordinary adapter commands were taking 600 to 800 ms against about 100 ms on other scans that day. The car itself was fine and answering everything.

The scan had just finished trying the odometer and was switching back to broadcast requests (AT SH 7DF), then sending 01 00 to check the switch worked. Here is the log, with what each line really was:

+01:28.487  TX  ATH0
+01:29.288  TX  AT SH 7DF
+01:29.986  RX  OK
+01:29.986  TX  0100
+01:30.632  RX  OK
+01:30.632  TX  ATWS
+01:31.111  RX  4100BE3FA813
+01:31.141  RX  4100983A8013
TimeWhat the scan thoughtWhat it actually was
+01:29.986AT SH 7DF answered OKThe late OK for ATH0, 1.5 s after it was sent
+01:30.632The car answered 01 00 with OKThe OK for AT SH 7DF
+01:30.63201 00 failed, so reset the adapterThe car had not answered yet
+01:31.111(too late to matter)The real 01 00 replies

OK is not a possible answer to 01 00, so the scan decided the bus had failed and sent ATWS, a warm start. The log said so in plain words: "broadcast restore failed verification — performing Warm Start (ATWS)". The adapter lost its configuration and the scan re-initialized it from scratch. The two real replies at +01:31 are byte-identical to the same request at the start of the scan. Nothing on the bus had failed.

The reset did not fix the pairing, either. About four and a half seconds after it, 01 42 was answered by OK, and its real reply, 41 42 2E C4, arrived after the next command had gone out.

Phantom modules

The quieter damage was in the module list. That scan reported these as confirmed present:

ECM (first responder), ECM,
700, 747, 7C0

Addresses 700 and 747 never sent any data. Each was asked 22 01 03, and what landed in their reply slots was the late OK from the AT CRA command before them, followed by STOPPED. Only 7C0 really replied.

So a late OK can make an absent module look present. That is the mirror image of the usual trap, where a silent address looks the same as a missing module. Anything built on "which modules are there" inherits the error.

Not just a slow adapter: the 2013 MINI R56

It would be easy to blame the failing adapter. A second capture shows the same pattern on good hardware. On a 2013 MINI R56 with a healthy adapter reporting ELM327 v2.2, AT CEA 60 got no reply within its timeout. The scan gave up on it after about 1.3 seconds and moved on. From then on every reply ran one slot behind:

The scan behaved honestly there: no mileage was decoded from the wrong bytes, and nothing was reset. But it shows a slow adapter is not the only trigger: an adapter command that misses its timeout does the same thing, on good hardware.

Why a longer timeout is not the fix

The tempting fix is to wait longer for each reply. That only moves the race. The next adapter that is slower than the new timeout lands in the same place, and in the meantime every scan is slower. The problem is pairing replies by arrival order, so the fix has to be in the pairing.

The rule that untangles it

An ELM327 only ever answers a bare OK to its own adapter (AT) commands. A request to the vehicle never gets a bare OK back. So when a bare OK shows up in a vehicle request's slot, it is the late acknowledgement of an earlier adapter command. What Lane Pilot does now, on both its Bluetooth and its USB/serial paths:

The fix is covered by tests that drive the real receive code with these patterns. We have not yet recorded it firing on a real scan with a slow adapter, so that log line from a real car is still owed.

What to look for

If you build scan software: pair by content, not by order, and only count a module as present when it answered with data.

More field notes