
OBD Message Formats
On Board Diagnostics systems are designed to be
very flexible, providing a means for several devices to
communicate with one another. In order for messages
to be sent between devices, it is necessary to add
information describing the type of information being
sent, the device that it is being sent to, and perhaps
which device is doing the sending. Additionally, the
importance of the message becomes a concern as
well – crankshaft position information is certainly of
considerably more importance to a running engine
than a request for the number of trouble codes stored,
33 of 83
ELM329
ELM329DSC
Elm Electronics – Circuits for the Hobbyist
www.elmelectronics.com
or the vehicle serial number. So to convey importance,
messages are also assigned a priority.
The information describing the priority, the
intended recipient, and the transmitter are usually
needed by the recipient even before they know the
type of request that the message contains. To ensure
that this information is obtained first, OBD systems
transmit it at the start (or head) of the message. Since
these bytes are at the head, they are usually referred
to as header bytes. Figure 3 below shows a typical
OBD message structure that is used by the older OBD
Figure 3. An OBD Message - Initial Protocols
up to 7 data bytes
checksum
3 header bytes
priority
receiver
transmitter
TA
SA
protocol to use, simply send:
>AT SP 0
OK
and when the next OBD command is to be sent, the
ELM329 will automatically look for one that responds.
You will see a ‘SEARCHING...’ message, followed by
a response, after which you can ask the ELM329 what
protocol it found (by sending AT DP).
The ELM329 always searches in the order set by
the protocol numbers (ie 6, 7, 8, etc.). Note that the IC
only appears to provide some support for protocols 1
to 5, but it never actually sends messages using them
- all searches start with protocol 6.
The automatic search works well with OBDII
systems, but may not be what you need if you are
experimenting. During an automatic search, the
ELM329 ignores any headers that you have
previously defined (since there is always a chance that
your headers may not result in a response), and it
uses the default OBD header values for each protocol.
Selecting Protocols (continued)
It will also use standard requests (ie 01 00) during the
searches. If this is not what you want, the results may
be a little frustrating.
To use your own header (and data) values when
attempting to connect to an ECU, do not tell the
ELM329 to use protocol 0. Instead, tell it to either use
only your target protocol (ie. AT SP n), or else tell it to
use yours with automatic searches allowed on failure
(ie AT SP An). Then send your request, with headers
assigned as required. The ELM329 will then attempt to
connect using your headers and your data, and only if
that fails (and you have chosen the protocol with AT
SP An) will it search using the standard OBD default
values.
In general, 99% of all users find that enabling the
memory (setting pin 5 to 5V) and using the ‘Auto’
option when searching (you may need to send AT
SP 0) works very well. After the initial search, the
protocol used by your vehicle becomes the new
default, but it is still able to search for another, without
your having to say AT SP 0 again.