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.
| Field | Bits | What it holds |
|---|---|---|
| P | 3 | Priority. 0 wins arbitration, 7 loses. |
| R | 1 | Reserved, or extended data page in newer editions. Normally 0. |
| DP | 1 | Data page. Selects one of two pages of PGNs. |
| PF | 8 | PDU format. Decides whether PS is a destination or part of the PGN. |
| PS | 8 | PDU specific. A destination address or a group extension. |
| SA | 8 | Source 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.
| Type | PF | PS means | In the PGN? |
|---|---|---|---|
| PDU1 | below 240 | Destination address | No |
| PDU2 | 240 or more | Group extension | Yes |
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
0CF00401gives 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 is0x1368= 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.
| PGN | Name | How it is read here |
|---|---|---|
| 59904 (EA00) | Request | Three data bytes, least significant first, name the requested PGN. E5 FE 00 is PGN FEE5. Destination FF asks all nodes. |
| 60416 (EC00) | TP.CM | Connection management. Control byte 0x20 is a broadcast announcement: message size, packet count and the PGN being sent. |
| 60160 (EB00) | TP.DT | Data 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.
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.
| PGN type | Mask | Ignores |
|---|---|---|
| PDU2 | 03FFFF00 | Priority and source address |
| PDU1 | 03FF0000 | Priority, 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.
| Item | Typical value | Check |
|---|---|---|
| CAN high pin | Ctypical | Wiring diagram of the vehicle |
| CAN low pin | Dtypical | Wiring diagram of the vehicle |
| Bit rate | 250 kbit/stypical | Newer 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.