Reading Real-Time Data


In this tutorial, you will learn how to connect to OBD-II and read RPM, speed, engine load, and coolant temperature.

To follow along, you will need an OBD interface, a computer, and access to an OBD-II compliant vehicle. The OBD interface (“tester”) used in this example is an OBDLink S, but since it emulates the ELM327, you can use any interface that supports the ELM327 AT command set.

There is a common misconception that a tester “reads” data that is “broadcast” on the OBD bus. In fact, under normal circumstances, the tester must request the data it wants, from the Electronic Control Module (ECU).

Connect to the Tester

To get started, you need to connect the OBD interface to the diagnostic connector and the host. In this example, we will be using HyperTerminal — a terminal emulation program included with Windows XP and earlier versions of Windows. If you use a newer version of Windows (Vista or 7), you can use TeraTerm, RealTerm, or any other terminal emulation software.

Configure the COM port for 115.2kbps, and connect the interface to your computer and the vehicle’s diagnostic port. If you did the steps in this order, you will see the device identify itself and print the command prompt:

ELM327 v1.3a

>

Set the Protocol

Let’s set the protocol to “AUTO”, which means that you want the interface to automatically detect the protocol when you send the first OBD request. To do this, enter the “AT SP 0” command:

>AT SP 0
OK

To verify the protocol, enter the AT DP command (“Display Protocol”):

>AT DP
AUTO

Get RPM

Now it is time to send our first OBD request. Real-time parameters are accessed through Mode 1 (also called “Service $01”), and each parameter has a Parameter ID, or PID for short. RPM’s PID is 0C, so we must tell the interface to send “010C”:

>010C
SEARCHING: OK
41 0C 0F A0

The reply contains two bytes that identify it as a response to Mode 1, PID 0C request (41 0C), and two more bytes with the encoded RPM value (1/4 RPM per bit). To get the actual RPM value, convert the hex number to decimal, and divide it by four:

0x0FA0 = 4000
4000 / 4 = 1000 rpm

Get Vehicle Speed

Speed’s PID is 0D:

>010D
41 0D FF

To get the speed, simply convert the value to decimal:

0xFF = 255 km/h

Get Engine Load

Engine load is PID 04, and we need to first divide the response by 255, and multiply it by one hundred percent:

>0104
41 04 7F

Translated:

0x7F = 127
(127 / 255) * 100 = 50%

Get Coolant Temperature

Coolant temperature (PID 05) is reported in degrees, and is obtained by subtracting 40 from the value:

>0105
41 05 64
0x64 = 100
100 - 40 = 60C

The SAE J1979 document describes the generic OBD-II modes and PIDs. Some of the PIDs may also be found on Wikipedia.