#can-bus #networking #can #sae-j1939

no-std j1939

SAE J1939 is a set of standards that define how ECUs communicate via the CAN bus in heavy-duty vehicles

21 releases

0.1.33 Jun 10, 2024
0.1.32 Jun 3, 2024
0.1.31 May 18, 2024
0.1.30 Mar 25, 2024
0.1.20 Feb 29, 2024

#204 in Embedded development

24 downloads per month

GPL-3.0 license

195KB
4K SLoC

J1939

Rust

A Rust crate for the SAE J1939 automotive protocol.

Getting Started

Build a J1939 frame with PGN 'address claimed'.

let id = j1939::IdBuilder::from_pgn(j1939::PGN::AddressClaimed)
    .priority(3)
    .sa(0x11)
    .da(0xff)
    .build();

let frame = j1939::FrameBuilder::new(id)
    .copy_from_slice(&name.to_bytes()[..])
    .build();

Note that this just an example and not the actual 'address claimed' frame as specified by the SAE J1939 standard.

Some common PGNs have defined data structures. For example the Time/Date PGN is fully implemented.

let timedate = j1939::spn::TimeDate {
    year: 2024,
    month: 4,
    day: 20,
    hour: 10,
    minute: 1,
    second: 58,
};

let id = j1939::IdBuilder::from_pgn(j1939::PGN::TimeDate)
    .sa(0x28)
    .build();

let frame = j1939::FrameBuilder::new(id)
    .copy_from_slice(&timedate.to_pdu())
    .build();

Example

$ cargo run --example j1939decode 0x0CB34A29

This runs a J1939 ID decoder on the ID '0x0CB34A29'. Each of the J1939 aid properties can be accessed with this crate.

no_std

This crate supports no_std. By default the crate creates no_std targets which means you can use the J1939 crate on embedded systems that do not support dynamic allocation.

Contribution

All feedback welcome. Feel free to file bugs, requests for documentation and any other feedback to the [issue tracker][issues].

License

J1939 is distributed under the terms of GPL-3.0.

See LICENSE for details.

Dependencies

~1MB
~18K SLoC