Direktes senden und empfangen von CAN-Bus Nachrichten mit einem ELM327-Adapter

  • Ich wollte diese Serie mal starten um denjenigen die interessiert sind zu zeigen wie man mit einfachen Mitteln, ohne teure Spezial-Hardware/Software auch direkt über den CAN mit Steuergeräten sprechen kann. Hier wird nur ein einfacher ELM-Adapter, ein PC und ein Terminalprogramm vorausgesetzt.

    Einige Dinge gleich vorweg...

    • Von besagtem ELM-Chip gibt es bekannterweise unzählige Raubkopien (Clones) aus China. Ich verwende auch so einen, mit automatischem HS-CAN/MS-CAN Umschalter weil ich keinen Bock auf das rumgeschalte habe und weil die inzwischen günstig genug sind das sich einer mit manuellem Umschalter nicht mehr lohnt. Aber immer mit Kabel, nicht mit Bluetooth oder WLAN. Dazu gibt es dann auch mitunter irgendwelche Handy/Tablet-Apps oder so. Damit beschäftige ich mich aber nicht.
    • Für "intensive" Dinge wie z.B. Firmware-Uploads ist die Methode ungeeignet, es geht hier wirklich nur um Kleinigkeiten bzw. Erkenntnisgewinn. Sowas wie das auslesen von Parameter, patchen von Parametern oder ausführen von Modul-Funktionen ist jedoch möglich.
    • Auch entbehrt diese Methode jeglichem Komfort. Man arbeitet hier quasi direkt Low-Level und muss schon wissen was man da sendet oder empfängt. Ein gewisse Kenntnis der Protokolle zur Erzeugung bzw. Interpretation der Botschaften ist unerlässlich. Es gibt also keine Klicki-Bunti Tools mit toller Fehlermeldung, sondern es muss alles Hard-Core gemacht werden. Wem Begriffe die Hexadezimal und CAN nichts sagen, sollte hier erst nachholen.

    P.S.: Ein Nachruf auf Elm Electronics die dieses Jahr ihr Geschäft eingestellt haben.

    Los gehts!

    Grundsätzlich arbeiten alle ELM-Adapter gleich. Auf der einen Seite geht es per OBD-Port zu den CAN-Bussen vom Fahrzeug, auf der anderen per USB-Kabel in den PC. Dort bildet der Adapter über entsprechende Treiber einen virtuellen COM-Port ab. Er verhält sich also wie ein serielles Endgerät. Der original ELM-Chip (ein programmierter PIC) nutzt ein Heyes-Ähnliches Protokoll, wie man es früher bei den Modems kannte (die Älteren unter uns werden sich erinnern...). Man spricht also ein ELM-Protokoll mit dem Chip und der Chip spricht setzt das dann in CAN-Bus Botschaften um, bzw. umgekehrt. Die Befehle sind gut dokumentiert, von ELM selbst und auszugsweise auch im Wiki https://mk4-wiki.denkdose.de/artikel/elm327…protokoll/start

    Terminalprogramm einstellen

    Um nun direkt mit dem ELM-Adapter sprechen zu können braucht man noch ein Terminalprogramm. Ich verwende dazu HTerm (https://www.der-hammer.info/pages/terminal.html) aber es gibt natürlich unzählige andere die genauso ihren Dienst tun werden. Der Script Communicator (https://sourceforge.net/projects/scriptcommunicator/) ist richtig gut und hat viele nützliche Zusatzfeatures, hat aber auch eine andere Lernkurve die HTerm.

    Nach dem Start von HTerm stellt man die COM-Parameter ein (1). Der COM-Port des Adapters sollte bekannt sein. Einfache Möglichkeit den rauszufinden ist, den Adapter erstmal nicht anzustecken und die Liste der Ports aufzuklappen. Danach dann anstecken, kurz warten, den "R"-Button drücken und nochmal nachsehen, dann man sollte den neuen erkennen.

    Die Parameter für die serielle Kommunikation (1) stellt man am besten erstmal auf die Default-Parameter des ELM-Chips ein: 38.400 Baud, 8 Daten-Bits, 1 Stopp-Bit, keine Parität (8N1) und klickt "Connect".

    (!) Der ELS27 oder TRE27, bzw. andere ELM-Adapter mit automatischer HS/MS CAN Umschaltung verwenden ggf. andere Baudraten. Mein TRE27 z.B. arbeitet nach dem anstecken mit 2 MBaut (2.000.000 Baud).

    Das Terminal wirkt wie eine Kommandozeile. Jedes eingegebene Kommando muss mit einem Zeilenende-Zeichen abgeschickt werden. Hat man nichts anderes eingestellt ist dies einfach das Return-Zeichen (als "CR" oder auch "\r" dargestellt). Das stellt man sowohl beim Empfang als auch beim Senden ein (2).

    Weil die Schnittstelle zum ELM rein auf ASCII-Zeichen basiert (auch Daten werden als ASCII-Zeichen kodiert angegeben), stellen wir den Typ auch entsprechend ein (3).

    Erste Kommunikation und CAN-Parameter einstellen

    Bevor man irgendwas anderes tut sollte man die Kommunikation überprüfen und ob man mit dem richtigen COM verbunden ist. Das geht am einfachsten mit dem "AT WS" Kommando, welches die Version des ELM-Chips (Firmware) zurückliefern sollte:

    Code
    AT WS
    > ELM327 v1.5

    Das ">" ist nicht Bestandteil der Botschaft, es wird vom Terminalprogramm hinzugefügt

    Nun sollte man die Schnittstelle einstellen:

    Code
    AT L0
    > OK
    AT E0
    > OK

    AT L0 => Sende kein zusätzliches LF-Zeichen am Zeilenende (Default: L0). Diese Einstellung muss mit der in HTerm korrespondieren.

    AT E0 => Erwarte die gesendeten Befehle nicht als Echo zurück (Default: E1). Fortan gibt es also nur noch "OK", Nutzdaten oder eine Fehlermeldung in dem "Received Data" Fenster.

    CAN-Schnittstelle konfigurieren

    Nun müssen wir den Adapter für den Bus vorbereiten mit dem wir kommunizieren wollen. Das wird über das "SP" Kommando (Set Protocol) erledigt. Dieses gibt sowohl den Typ als auch die Geschwindigkeit des Busses an. Der CAN im Mondeo ist ausnahmslos mit 11 Bit IDs (Standard ID) und es gibt nur zwei Geschwindigkeiten, 500 kbaud und 125 kbaud. Somit kommen nur zwei Modi in Frage:

    • "AT SP 6" => HS-CAN
    • "AT SP B" => MS-CAN / MM-CAN

    Als Beispiel nehme ich mal das BCM. Dieses kommuniziert ausschließlich auf dem HS-CAN mit einem Tester. Also

    Code
    AT SP 6
    > OK

    Um nun ein reines CAN-Paket zu senden (also ohne die eigentlichen Stärken des ELM das Protokoll zu kennen auszunutzen) geben wir zunächst die CAN-ID der zu sendenden Botschaft an:

    Code
    AT SH 726
    > OK

    In diesem Fall senden wir mit CAN-ID 0x726, darauf reagiert das BCM.

    Da der ELM-Chip für OBD entwickelt wurde und es dort nur Botschaften mit max. 7 Datenbytes gibt, wir aber 8 haben wollen für volle Flexibilität, müssten wir das noch umstellen. Der Befehl hierfür lautet "AL" (Allow Long Messages):

    Code
    AT AL
    > OK

    Es gibt noch mehr Automatismen abzustellen um reine CAN-Botschaften zu verschicken:

    Code
    AT CAF 0
    > OK
    AT ST FF
    > OK

    Der "CAF0" sorgt dafür das ELM nicht versucht die Antworten zu formatieren.

    Das "ST40" setzt einen höheren Timeout für die Antworten. Der Default is "32" was 200 ms entspricht. Das ist für manche Anfrage zu kurz und ELM sendet dann "NO DATA" auf die Konsole. Daher setzen wir ihn etwas höher... Sollte das BCM im Schlafmodus sein, reicht auch diese Zeit nicht aus, dann macht es Sinn vorher eine andere CAN-Botschaft zum aufwachen zu senden.

    Damit wir eine Antwort besser zuordnen können aktivieren wir die Anzeige der Header-Informationen

    Code
    AT H1
    > OK

    Nun können wir die ersten Daten senden!

    Ab dann reicht es aus die Rohdaten zu senden:

    Code
    03 22 2A 00 00 00 00 00
    > OK
    ...
    > 72E 07 62 2A 00 BD CE 6C 8

    Hiermit habe ich die TPMS-Sensor-ID (VR) abgefragt. Die Antwort vom BCM (CAN-ID 0x72E) lautete: "BDCE6C08".

    "Lernen ist Erfahrung. Alles andere ist einfach nur Information."

    Albert Einstein

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!