Additional Information

Site Information

 Loading... Please wait...

Guide To SAE J1939 - Communication Methods

Posted by Wilfried Voss on

The following is an excerpt from A Comprehensible Guide To J1939 by Wilfried Voss.

A Comprehensible Guide to SAE J1939

SAE J1939 provides three communication methods, each serving a specific purpose.

1. Destination Specific Communications:

Destination specific communications use PDU1 (PF values 0 to 239), but also the global destination address 255. There are cases where this method will require the utilization of destination specific Parameter Group Numbers, for instance, in the case of more than one engine. A torque message, for example, must be sent only to the desired engine and not to both.[1]

2. Broadcast Communications

Broadcast communications use PDU2 (PF values 240 to 255) and, as the name implies, they can include:

  • Sending a message from a single or multiple sources to a single destination.
  • Sending a message from a single or multiple sources to multiple destinations.

3. Proprietary Communications

Proprietary communications use either PDU1 or PDU2 and, as the name implies, they are useful in case where standard communications are not practical[2].

The use of PDU1 or PDU2 indicates that there may be:

  • Broadcast Proprietary Communications


  • Destination Specific Proprietary Communications

A Parameter Group Number (PGN) has been assigned for both proprietary communication types.

The reception and processing of received messages are explained in detail in SAE J1939/21 (Data Link Layer) and J1939/7x (Application Layer).

In general a received message is handled according to the communication method[3]:

  • Destination Specific Request or Command

Each receiving ECU must determine whether the incoming destination address matches its own address and if yes, it must process the message and respond accordingly[4].

  • Global Request

Each ECU in the network, even the sender of the request, must process the message and respond if the requested data is available.

  • Broadcast

Each ECU must determine individually whether or not the message is relevant.

[1] The SAE J1939 document uses the expression “…the message must be directed to one or another specific destination and not both.”

[2] The SAE J1939 document uses the expression “Where it is important to communicate proprietary information.” - yet another example of pointless redundancy.

[3] The SAE J1939 document uses the sentence “Several general observations can be made however regarding received messages.” which not only lacks the proper grammar, but it also raises the question whether SAE J1939 is a research project (hence “observations”) or a Standard where network specifics are outlined.

[4] SAE J1939 uses the vague wording “…provide some type of acknowledgement.”

SAE J1939 ECU Simulator Board With USB Port

SAE J1939 ECU Simulator Board With USB Port

The jCOM.J1939.USB gateway board is a high-performance, low-latency vehicle network adapter for SAE J1939 applications. It allows any host device with a USB COM port to monitor SAE J1939 data traffic and communicate with the SAE J1939 vehicle network.

The board supports the full SAE J1939 protocol according to J1939/81 Network Management (Address Claiming) and J1939/21 Transport Protocol (TP). It is also supported by an extensive programming interface for Windows and Linux/Ubuntu applications, including full C/C++/C# source code for short time-to-market developments.

The strength of the board lies in the fact that the entire SAE J1939 protocol, including all timing requirements, is stored on-chip, thus taking the burden off the main system. The board uses a USB COM port to communicate with the main system, i.e. all data transfer is handled through a standard COM port access. 

The communication protocol between the board and the main system is well documented and thus allows a porting to any computer system with a USB connection. Working source code libraries exist for Windows (C# under Visual Studio 2012/2013), Linux and its derivatives (C++ using Code::Blocks), and Raspberry Pi (C using the standard gcc compiler).

More Information...