Developers and integrators · Free decoder

J1939 CAN ID, PGN and SPN decoder

Paste frames from a truck's CAN bus. Each 29-bit ID is split into priority, PGN, source and destination, and the data bytes become engine speed or any signal you define. Calculations run in your browser. Inputs are sent only if you ask for the emailed report.

One frame per line, up to 400 lines: the ID, then the data bytes. Accepted layouts are "ID FF FF", "ID#FFFF" from candump, and comma-separated lines. A time stamp or an interface name before the ID is ignored. The sample is made up. Replace it with your own capture.

Load a sample

Every line is decoded on its own. A line that cannot be read is listed with the reason and is not counted.

Filters the list. The counts and the report always use every line.

line

The line number of the frame shown below with its 29 bits.

How the PGN is formed
PDU2 (PF 240 or more): PGN = DP x 65536 + PF x 256 + PS PDU1 (PF below 240): PGN = DP x 65536 + PF x 256, PS = destination 0x0CF00401 → priority 3, PF 240, PS 4, SA 1 → PGN 0xF004 = 61444
Decoded framesYour log

Keep a record of this capture

A report with the decoded frames, the PGNs seen and the signal values.

Decode report

Get the frames, the PGNs and the signal values in one report

  • Every frame with priority, PGN, source and destination
  • The PGNs seen and how often
  • Signal values with their raw bytes
  • The identifier you built, with its filter
  • Notes on lines that could not be read

What is inside a J1939 identifier?

J1939 runs on the CAN bus of trucks, buses and heavy equipment. Every message uses the 29-bit extended identifier. The identifier is not just an address. It carries the priority, the message type (the PGN) and the node that sent it.

P0113R00DP00PF11110000F0 · 240PS0000010004 · 4SA0000000101 · 1
Identifier 0CF00401, the engine controller EEC1 broadcast from source address 1.
Fields of the 29-bit identifier
FieldBitsWhat it holds
P3Priority. 0 wins arbitration, 7 loses.
R1Reserved, or extended data page in newer editions. Normally 0.
DP1Data page. Selects one of two pages of PGNs.
PF8PDU format. Decides whether PS is a destination or part of the PGN.
PS8PDU specific. A destination address or a group extension.
SA8Source address of the node that sent the frame.

PDU1 or PDU2?

PF decides. When PF is below 240 the message is PDU1: it is addressed to one node, and PS is that node's address. PS is not part of the PGN, so the PGN always ends in 00. When PF is 240 or more the message is PDU2: it is broadcast, and PS is a group extension that is part of the PGN.

PDU1 and PDU2
TypePFPS meansIn the PGN?
PDU1below 240Destination addressNo
PDU2240 or moreGroup extensionYes

Worked example: engine speed

This example is published in a public J1939 introduction. Paste it into the decoder to follow the steps.

0CF00401 FF FF FF 68 13 FF FF FF

  • The identifier 0CF00401 gives priority 3, PF 240, PS 4 and source address 1.
  • PF is 240, so the message is PDU2 and the PGN is 240 x 256 + 4 = 61444 (hex F004), known as EEC1.
  • Engine speed (SPN 190) is in bytes 4 and 5. The bytes are 68 13, and the least significant byte comes first, so the raw value is 0x1368 = 4968.
  • The resolution is 0.125 rpm per bit: 4968 x 0.125 = 621 rpm.

Request and transport frames

Three PGNs are not data signals. They control the conversation, and the decoder explains them in the Meaning column.

Control PGNs
PGNNameHow it is read here
59904 (EA00)RequestThree data bytes, least significant first, name the requested PGN. E5 FE 00 is PGN FEE5. Destination FF asks all nodes.
60416 (EC00)TP.CMConnection management. Control byte 0x20 is a broadcast announcement: message size, packet count and the PGN being sent.
60160 (EB00)TP.DTData transfer. The first byte counts the packet, the other seven carry the data. Up to 255 packets, so up to 1785 bytes.

Reading a signal from the data bytes

A signal (an SPN) is a bit field inside the 8 data bytes of one PGN. J1939 sends the least significant byte first, so a two-byte value is read from right to left. The physical value is the raw number times the resolution, plus the offset.

Value = raw x resolution + offset Not available: all bits 1 (a 16-bit signal: top byte FF) Error: all bits 1 minus one (a 16-bit signal: top byte FE)Special values follow the J1939-71 convention quoted in a public J1939 introduction. Check your own definition.
Scaling is not guessed

The full SPN list is in SAE J1939-71, which is a paid standard, and every vehicle maker adds its own. The tool ships one signal with a published source and lets you add the rest. Verify every definition against the current official text or your maker documentation.

Filters and masks for one PGN

To receive one PGN from any source, set the filter ID to the PGN shifted left by 8 bits and use a mask that ignores priority and source address. The Build an ID tab prints both.

Masks
PGN typeMaskIgnores
PDU203FFFF00Priority and source address
PDU103FF0000Priority, destination and source address

Trucks use J1939, not OBD-II PIDs

Passenger cars are usually read with OBD-II PIDs (SAE J1979). Many heavy trucks and buses publish their engine and vehicle data as J1939 messages instead, on the CAN pair of the diagnostic connector or of the 9-pin Deutsch connector. Check the vehicle before you choose the method.

9-pin connector and bus speed
ItemTypical valueCheck
CAN high pinCtypicalWiring diagram of the vehicle
CAN low pinDtypicalWiring diagram of the vehicle
Bit rate250 kbit/stypicalNewer vehicles may use 500 kbit/s (J1939-14)

What usually goes wrong?

  • Every signal reads "not available". The sensor may not exist on this vehicle, or the definition points to the wrong bytes.
  • The value is far too large. The bytes were read most significant first. J1939 sends the least significant byte first.
  • Short identifiers. A 3-digit identifier is an 11-bit standard frame. It is not J1939.
  • The PGN looks wrong for a PDU1 message. The low byte of a PDU1 PGN is the destination, so it is not part of the PGN.
  • A log shows 8 hex digits for every frame. Some tools add the flag 0x80000000 for extended frames. The decoder removes it.

Sources and limits

  • Identifier layout, the EEC1 example, the request and transport frames, the masks and the connector pins: Public J1939 introduction. Verify them against the current SAE J1939 text.
  • The 29-bit identifier is in the abstract of SAE J1939-21, Data Link Layer. The bit rates are in the titles of SAE J1939-11, 250 kbit/s and SAE J1939-14, 500 kbit/s. Source and date checked: 3 November 2026.
  • The proprietary PGN range 00FF00 to 00FFFF is from the SAE J1939 overview. The SAE text that defines it is paid, so check it against the current SAE J1939-21.
  • The tool does not include the full SPN list. Scaling, offsets and special codes for other signals are yours to enter.
  • A frame that decodes does not prove the data is right for your vehicle. Compare a value with the dashboard before you rely on it.
  • The calculations run in your browser. The pasted text and inputs are sent to our server, and kept for up to 45 days, only if you ask for the emailed report. A share link you copy yourself also carries the text when it is short.
  • This page does not say that any device or vehicle supports J1939. That depends on the model and its configuration.
Related Tracom solution

Know what the bus carries before you plan an integration

Tracom designs its devices around second-by-second data, and an SCMS portal manages device settings and configuration files. Use this decoder to see what your vehicle sends, then ask Tracom which CAN inputs your device model supports.

  • Second-by-second data records how the vehicle behaves in fine detail.
  • SCMS portal manages device settings and configuration files in one place.
  • Advanced configuration files keep a tested setup repeatable across vehicles.
  • Over-the-air updates bring new firmware to devices in the field.
Questions

Questions about J1939 decoding

Integrating a truck or checking a CAN input? Contact Tracom.

What is the difference between a PGN and an SPN?

A PGN names a message, and it is part of the identifier. An SPN names one signal inside a message, such as engine speed in EEC1. One PGN usually carries several SPNs.

How do I tell PDU1 from PDU2?

Look at PF, the third byte of the identifier from the left. Below 240 (hex F0) it is PDU1 and PS is a destination. At 240 or more it is PDU2 and PS is part of the PGN.

Why does a signal read "not available"?

All bits of the field are 1, which J1939 uses for "no data". The vehicle may not have that sensor, or the definition may point to the wrong bytes. Switch special values off to see the number.

Does the tool contain every SPN?

No. The full list is in SAE J1939-71, a paid standard, and makers add their own. The library has one published signal, and you add the rest from your own source.

Is my CAN log uploaded?

Only if you ask for the emailed report. The text is decoded in your browser. If you ask for the report or the CSV, the text and inputs are sent to our server and kept for up to 45 days.

Does Tracom ST100 or M1N read J1939?

This page makes no claim about it. Which CAN inputs a device supports depends on the model and its configuration. Contact Tracom with your vehicle and the signals you need.

Related tools and templates

Keep going with the integration

Get the report

Enter your details and we will email you the file.

Use your real name so the file arrives addressed to you. Don't worry, we won't flood you with emails or calls.

Scroll to Top