Get The Analogue

E39 diagnostics: why a Bluetooth dongle only sees the engine

Why a Bluetooth OBD-II dongle reads only the engine on a BMW E39, where the body modules live, and what it takes to reach them.

By Chase Waters · · 6 min read

Plug a Bluetooth OBD-II dongle into a BMW E39 and you get the engine: live data, the VIN and a few P-codes. Then the instrument cluster tells you something the scanner swears is not there. The check control light, the ABS light, the airbag light, a climate fault. The dongle is not broken. It is asking the only computer it knows how to ask. I own a 2003 E39 and most of what follows comes from my own car, read byte by byte.

What a Bluetooth dongle actually reads on an E39

The E39 was built from September 1995 to May 2004, with M52, M54, M62 and S62 petrol engines and M47, M51 and M57 diesels. US cars are the 1997 to 2003 model years. OBD-II became mandatory on US passenger cars for 1996, and in the EU petrol cars registered from January 2001 had to carry its European twin, EOBD. That rule is about emissions, so what it guarantees is the engine.

On my E39 the engine computer (an MS43, behind the M54) speaks OBD-II over ISO 9141-2 on pin 7 of the 16-pin port. A dongle gets everything that standard promises: the VIN, 21 supported live values, stored codes and pending codes. On my car that read gave P0491 and P0492, the secondary air codes, every time.

What it does not get is anything else. The OBD-II standard lets a maker use the connector for its own systems, and BMW did, with its own protocol. A dongle built around a generic ELM327-style chip never speaks it.

Two buses behind one plug: K-line and the DS2 body bus

The E39 has two K-lines. A K-line is a single wire that carries serial data in both directions. Pin 7 is the one OBD-II defines. Pin 8 is left to the maker, and on some BMWs it is a second K-line. On my car the split is clean, and I proved it by flipping the pin 7/8 switch on my cable:

Cable positionWhat answered on my E39
Pin 7 (powertrain)Engine (DME) at 0x12, transmission (EGS) at 0x32
Pin 8 (body)Engine at 0x12, instrument cluster (IKE), light control (LCM), stability control (DSC), immobiliser (EWS), climate (IHKA), general module (GM)

The modules on pin 8 speak DS2: 9600 baud, even parity, no wake-up handshake, each module at its own address with its own fault memory. Those memories are separate from the engine's OBD-II codes. Clearing one does not touch the other.

The trap is that the engine answers in both positions. Live data and engine codes work either way, so nothing ever looks wrong. You simply never see half the car. No single switch position sees all of it.

A full sweep of the DS2 addresses on my car found 14 modules, including several the app had never asked: the airbag computer at 0xA4, a steering angle sensor at 0x57, a rain and light sensor at 0xE8, the radio at 0x68 and a centre console switch cluster at 0xF5.

The round 20-pin port and the OBD-II port

Earlier E39s have a round 20-pin socket under the bonnet as well as the 16-pin OBD-II port inside the car. The adapter sellers put the change at around 2000, after which BMW moved to the cabin port alone. One seller's own fitment list gives the E39 as 1996 to 2000 for the round port. The car finder on my site says it plainly: an E39 built before late 2000 may need the 20-pin to 16-pin adapter.

On cars that have both, the seller of that adapter describes the cabin port as mainly for emissions testing and recommends the round port for full diagnostics. If your E39 has the round socket, open it and use it.

On a later car with only the cabin port, both K-lines come out of the 16-pin plug. That is why the pin 7/8 question matters so much on those cars.

The "two ECUs answer" quirk

This one cost me days. Send my E39 a standard OBD-II request for supported values and two replies come back:

  • one from the engine at address 0x12
  • one from something at address 0x18 that supports a single value

Each reply is a valid frame with a correct checksum. ISO 9141-2 frames carry no length byte, so a tool that treats the whole answer as one frame adds both together, gets the wrong checksum and reports corruption. To the owner it looks like a bad wire. In my case it explained three symptoms at once: live values that dropped out at random, a handshake test that said the engine never answered, and a connection check that said "no engine reply".

The fix is to walk each frame from its header until its own checksum closes, then keep only the one from the computer you asked. Never borrow the other module's answer, or a transmission value turns up as a coolant temperature. I have not identified 0x18. It is probably the transmission on my automatic, but I have not proven that, so the app does not label it.

What reading the other modules takes

Reaching the rest of an E39 takes four things a Bluetooth dongle does not have.

  1. A wire to pin 8. A K+DCAN cable with a pin 7/8 switch, or the round socket on an earlier car.
  2. The DS2 protocol, sent with tight timing. 9600 baud, even parity, the right address and the right request for each module.
  3. Patience with sleeping modules. On my car the DSC answered one evening and was silent the next morning. A module that stays quiet has to be woken at its own address and asked again before anyone calls it missing. The app now says "fitted, quiet this time" for a module the car has answered from before.
  4. The right question for each computer. The airbag computer is the clearest case. The app used to ask address 0x58, where nothing on my car has ever answered. It lives at 0xA4, and every plain fault read sent there was refused until the app learned the short handshake its variant expects. On 17 October 2026 it gave up six stored faults on my car. I do not yet have a clean source for what those six codes mean, so the app shows them without a name rather than guess.

The engine has its own BMW fault memory on the body bus too. On my MS43 it returned three records: two match the secondary air codes the OBD-II read gives, and the third, 0x80, is a fault OBD-II never shows. The big live data block that would hold mixture adaptation and VANOS values answers, but I have not decoded it yet, so I make no claim for it.

Questions owners ask

Why does my OBD-II scanner only show engine codes on my BMW E39?

A generic OBD-II scanner speaks the emissions protocol that the engine computer answers on pin 7 of the port. The E39's cluster, lights, immobiliser, climate and stability control answer a different BMW protocol, called DS2, and on my car they sit on pin 8. A generic dongle never asks them, so it reports a clean car even when the dash is lit up.

Does the BMW E39 have a 20-pin diagnostic port?

Earlier E39s have a round 20-pin socket under the bonnet as well as the 16-pin OBD-II port inside the car. Adapter sellers put the change at around 2000, after which BMW used the cabin port alone. If you find the round socket on your car, that is the one the sellers recommend for full diagnostics, and you need a 20-pin to 16-pin adapter to use it.

What is the DS2 body bus on a BMW E39?

DS2 is the BMW diagnostic protocol the E39's body computers answer. It runs over a single K-line wire at 9600 baud with even parity, with each module answering at its own address. Every module has its own fault memory, separate from the engine's OBD-II codes.

Why does my scan tool show a checksum error on my E39?

On my E39 two computers answer the same OBD-II request: the engine at address 0x12 and a second unit at 0x18. Each reply is valid alone, but a tool that treats both as one frame computes a wrong checksum and reports corruption. The wire is fine; the tool needs to split the replies and keep the one from the engine.

Can a Bluetooth dongle read the airbag light on an E39?

Not through standard OBD-II. The airbag computer on my 2003 E39 answers DS2 at address 0xA4 and only gives up its fault memory after a short handshake that its own variant expects. A generic dongle never sends that, so it cannot see the airbag faults at all.

Sources

  1. Wikipedia: BMW 5 Series (E39), production dates and engines
  2. Wikipedia: On-board diagnostics (US mandate, EOBD dates, connector pins, ISO 9141-2 and KWP2000)
  3. BimmerWorld: Foxwell 20-pin round port adapter for 1987 to 2000 BMWs
  4. YouCanic: do I need a BMW 20-pin adapter (models with the round port)