Kommunikation mit dem ELM327

Der ELM327 ist ein Übersetzer zwischen einer seriellen Textschnittstelle und den OBD-II-Bussen des Fahrzeugs. obd-diag schickt ihm Textbefehle und liest seine Antworten bis zum Prompt >. Grundlage ist das Datenblatt ELM327DSJ (Firmware v2.1, Quellen).

Leitung

  • Seriell, 8 Datenbits, keine Parität, 1 Stoppbit; 38400 oder 115200 Baud.

  • Jeder Befehl ist ASCII in Großbuchstaben ohne Leerzeichen und endet mit genau einem CR (\r). Ein einzelnes CR würde den letzten Befehl wiederholen und ist daher verboten (Datenblatt S. 9, Befehlsreferenz).

  • Der Adapter antwortet mit Zeilen, getrennt durch CR, und schließt mit > ab.

  • Vor jedem Schreiben leert SerialTransport den Eingangspuffer, damit keine alte Antwort für die neue gehalten wird.

Ablauf einer Sitzung

        sequenceDiagram
    participant T as obd-diag
    participant E as ELM327
    participant F as Fahrzeug
    T->>E: ATZ
    E-->>T: ELM327 v1.5 >
    T->>E: ATE0, ATL0, ATS0, ATH0, ATSP0
    E-->>T: OK > (je Befehl)
    T->>E: 0100 (bis 30 s)
    E->>F: Protokollsuche, dann 01 00
    F-->>E: 41 00 …
    E-->>T: SEARCHING... 4100BE3FA813 >
    T->>E: ATDPN, ATDP
    E-->>T: A6 > / AUTO, ISO 15765-4 (CAN 11/500) >
    T->>E: ATRV
    E-->>T: 12.4V >
    T->>E: 03, 07, 0A, 0101, 020200, 0902 …
    

Schritt

Befehl

Zweck

Zurücksetzen

ATZ

Adapter wie nach dem Einschalten; die letzte Antwortzeile ist die Kennung

Echo aus

ATE0

der Adapter wiederholt den Befehl nicht mehr

Zeilenvorschub aus

ATL0

nur CR als Zeilenende

Leerzeichen aus

ATS0

4100BE3FA813 statt 41 00 BE 3F A8 13

Header aus

ATH0

nur die Daten, ohne CAN-ID

Protokoll automatisch

ATSP0

Suche startet mit der ersten OBD-Anfrage; schreibt nicht ins EEPROM

Protokoll aushandeln

0100

unterstützte PIDs; beantwortet jedes OBD-II-Fahrzeug

Protokoll melden

ATDPN, ATDP

Nummer (6 = CAN 11 Bit 500 kbit/s) und Name

Bordspannung

ATRV

Spannung an der OBD-Buchse

Alle Befehle mit Datenblatt-Seite und Zitat stehen in der Befehlsreferenz.

Wartezeiten

Fall

Wartezeit

Begründung

jeder Befehl

10 s

Meldet ein Steuergerät 7F xx 78 (Antwort folgt), wartet der ELM327 selbst bis 5 s und beginnt bei jedem weiteren 78 neu (Datenblatt S. 45)

erstes 0100 nach ATSP0

30 s

die Protokollsuche probiert mehrere Protokolle; bei K-Line dauert schon ein Verbindungsaufbau 2 bis 3 s (S. 33, 36)

Fehlercodes nach 7F <Mode> 78

bis 5 s weiterlesen

ohne erneut zu senden

Löschen nach 7F 04 78

bis 10 s weiterlesen

Mode 04 wird nie wiederholt

Protokoll erkennen

Ob das Fahrzeug CAN spricht, entscheidet, wie Fehlercode-Antworten zu lesen sind (Antwortformate). obd-diag fragt ATDPN:

  • 6 bis C (auch mit vorangestelltem A für „automatisch gefunden“) ist CAN, 1 bis 5 sind ältere Protokolle (J1850, ISO 9141-2, KWP2000).

  • Meldet der Adapter 0, ? oder Unsinn, wird 0100 bei fehlender Antwort einmal wiederholt und ATDPN erneut gefragt.

  • Bleibt die Nummer unklar, wird 0100 einmal mit Headern (ATH1) gesendet und an deren Form erkannt, ob CAN 11 Bit, CAN 29 Bit oder ein älteres Protokoll vorliegt. Die Protokollangabe trägt dann den Zusatz „laut Headern …“.

Antworten bereinigen

Elm327.command entfernt vor dem Auswerten:

  • das Echo des Befehls, auch in anderer Schreibweise (at dpn für ATDPN), aber nur vor der eigentlichen Antwort;

  • Statuszeilen SEARCHING... und BUS INIT: ...OK;

  • Leerzeilen, Nullbytes und Zeilen aus reinem Zeichenmüll (manche Klone senden nach ATZ z. B. ein Byte FC).

Danach gilt:

Antwort

Ergebnis

NO DATA

kein Steuergerät hat geantwortet; query liefert None

?

Adapter kennt den Befehl nicht (UnknownCommandError)

UNABLE TO CONNECT (auch BUS INIT: …UNABLE TO CONNECT)

NoConnectionError (ein ElmError): kein Steuergerät gefunden, meist ist die Zündung aus; Kommandozeile und Oberfläche sagen dazu, was zu tun ist

CAN ERROR, BUS ERROR, BUS BUSY, BUFFER FULL, DATA ERROR, FB ERROR, STOPPED, ERRxx, LV RESET, … <RX ERROR

ElmError, auch wenn schon Teildaten kamen

Hex-Daten

weiter an Antwortformate

Ein abgezogener Adapter (Ein-/Ausgabefehler) wird zu TransportError („Verbindung zu … unterbrochen“), ausbleibende Antworten zu TransportTimeout. Beides bricht den Ablauf ab; danach wird nichts mehr gesendet.