
Interpreting Trouble Codes
Likely the most common use that the ELM329 will
be put to is in obtaining the current Diagnostic Trouble
Codes (or DTCs). Minimally, this requires that a mode
03 request be made, but first one should determine
how many trouble codes are presently stored. This is
done with a mode 01 PID 01 request as follows:
>01 01
To which a typical response might be:
41 01 81 07 65 04
The 41 01 signifies a response to the request, and
the next data byte (81) is the number of current trouble
codes. Clearly there would not be 81 (hex) or 129
(decimal) trouble codes present if the vehicle is at all
operational. In fact, this byte does double duty, with
the most significant bit being used to indicate that the
malfunction indicator lamp (MIL, or ‘Check Engine
Light’) has been turned on by one of this module’s
codes (if there are more than one), while the other 7
bits of this byte provide the actual number of stored
trouble codes. In order to calculate the number of
stored codes when the MIL is on, simply subtract 128
(or 80 hex) from the number.
The above response then indicates that there is
one stored code, and it was the one that set the Check
Engine Lamp or MIL on. The remaining bytes in the
response provide information on the tests that are
supported by that particular module (see the J1979
document for further information).
In this instance, there was only one line to the
response, but if there were codes stored in other
modules, they would each provide a line of response.
To determine which module is reporting, you need to
turn the ‘headers’ on (with AT H1) which then shows
the ID bits associated with the message.
Having determined the number of codes stored,
the next step is to request the actual trouble codes
with a mode 03 request (there is no PID needed):
>03
A response to this could be:
43 01 03 02
The ‘43’ in the above response simply indicates
that this is a response to a mode 03 request. The next
byte (the ‘01’) says that 1 trouble code follows, while
the remaining two bytes provide the actual trouble
code (0302).
As was the case when requesting the number of
stored codes, the most significant bits of each trouble
code also contain additional information. It is easiest to
use the following table to interpret the extra bits in the
first digit as follows:
Powertrain Codes - SAE defined
0
“ “ - manufacturer defined
“ “ - SAE defined
“ “ - jointly defined
1
2
3
If the first hex digit received is this,
Replace it with these two characters
Chassis Codes - SAE defined
4
“ “ - reserved for future
5
6
7
Body Codes - SAE defined
8
9
A
B
Network Codes - SAE defined
C
D
E
F
P0
P1
P2
P3
C0
C1
C2
C3
B0
B1
B2
B3
U0
U1
U2
U3
“ “ - reserved for future
“ “ - manufacturer defined
“ “ - manufacturer defined
“ “ - manufacturer defined
“ “ - manufacturer defined
“ “ - manufacturer defined
“ “ - manufacturer defined
“ “ - reserved for future
Taking the example trouble code (0302), the first
digit (0) would then be replaced with P0, and the 0302
reported would become P0302 (which is the code for
an ‘cylinder #2 misfire detected’).
If there had been no trouble codes in the above
example, the ECU would have told you so. The
response would typically look like:
>03
43 00
That’s about all there is to reading trouble codes.
With a little practice, you will find it to be quite straight-
forward.
30 of 83
ELM329
ELM329DSC
Elm Electronics – Circuits for the Hobbyist
www.elmelectronics.com