Overview
The protocol stack
KWP2000 sits at the application layer of the diagnostic stack. Below it: the physical layer (K-line or D-CAN), the data-link layer (the framing on the bus), and the service layer (the actual diagnostic operations). Beemuu’s src-tauri/src/protocol/kwp2000.rs handles the KWP2000 framing and service dispatch.
Single-frame requests
KWP2000 requests fit in a single 8-byte CAN frame (or a single K-line frame on older vehicles). There is no segmentation layer — if a request needs more than 8 bytes, KWP2000 doesn’t carry it. This is a hard limit; bigger requests use a different protocol.
Service identifiers
KWP2000 services are 1-byte local identifiers. For example, 0x90 is the local ID for VIN read on E-series DME; 0x80 is the read-fault-memory ID. Each module has its own service-ID mapping — the DME’s 0x90 is different from the EGS’s 0x90.
Timing
The default KWP2000 request deadline is 1 second. The v0.13.0 cycle added per-target deadlines (1 s default, 3 s “slow”) that scale with the FTDI VCP latency timer. A 1 ms latency timer doesn’t pay a 3 s penalty on a 1 s target.
Beemuu support
Beemuu supports KWP2000 over the K+DCAN cable’s D-CAN pair. The protocol module dispatches between KWP2000 (E-series) and UDS (F/G-series) based on the connected cable and the target module’s address.
FAQ
What is KWP2000?
The diagnostic protocol BMW used on E-series vehicles, predating UDS. Single-frame requests on the K-line or D-CAN bus.
Is KWP2000 the same as OBD-II?
No. OBD-II is the emissions-mandated subset (P0xxx codes, generic PIDs). KWP2000 is BMW-specific and covers the full diagnostic surface including BMW-specific codes and live data.
Does Beemuu support KWP2000 today?
Yes. Beemuu uses KWP2000 over K+DCAN for E-series modules. The protocol module is in src-tauri/src/protocol/kwp2000.rs.