# Announcing canadensis (another Rust implementation of Cyphal)

**URL:** <https://forum.opencyphal.org/t/announcing-canadensis-another-rust-implementation-of-cyphal/1505>\
**Category:** Applications & Usage\
**Created:** [November 2, 2021, 4:49am UTC](https://forum.opencyphal.org/t/announcing-canadensis-another-rust-implementation-of-cyphal/1505 "2021-11-02T04:49:00Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![samcrow](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/samcrow/32/893_2.png) [@samcrow](https://forum.opencyphal.org/u/samcrow)\
**Post date:** [November 2, 2021, 4:49am UTC](https://forum.opencyphal.org/t/announcing-canadensis-another-rust-implementation-of-cyphal/1505/1 "2021-11-02T04:49:00Z")

</div>

I recently released version 0.2 of [canadensis](https://github.com/samcrow/canadensis), which implements UAVCAN v1 in Rust. This version fixes many of the limitations and inconvenient aspects of the previous version.

Major new features in version 0.2 include:

- A pure-Rust DSDL parser and code generator that produces Rust data types and serialization/deserialization code
  - A procedural macro that you can put in your Rust code to generate code from data types as part of the normal build process

- Experimental UAVCAN/UDP and UAVCAN/Serial transports (these transports are not yet fully specified, but the canadensis implementations are compatible with pyuavcan)

The core functionality, UAVCAN/CAN transport, and UAVCAN/Serial transport work on microcontrollers with `#![no_std]`, although they do use dynamic memory allocation. All functions that allocate memory return errors if memory allocation fails, instead of aborting or calling the global allocation error handler.

The UAVCAN/CAN transport is reasonably stable, and I have been using it successfully on some microcontrollers communicating over classic CAN.

There are [some examples that run on Linux](https://github.com/samcrow/canadensis/tree/master/canadensis/examples) to show some ways to use different parts of canadensis.

Like all non-trivial software, canadensis contains bugs. Issues and pull requests are welcome in [the canadensis repository](https://github.com/samcrow/canadensis).

---

<div class="post-metadata">

**Author:** ![samcrow](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/samcrow/32/893_2.png) [@samcrow](https://forum.opencyphal.org/u/samcrow)\
**Post date:** [March 31, 2023, 2:36pm UTC](https://forum.opencyphal.org/t/announcing-canadensis-another-rust-implementation-of-cyphal/1505/2 "2023-03-31T14:36:34Z")

</div>

I recently released new versions of several of the canadensis crates.  
Major changes:

- Cyphal/UDP updated to match the latest draft specification
- Cyphal/Serial updated to use the new header format that is shared with Cyphal/UDP
- Basic support for CAN loopback frames, which are useful for time synchronization
- Documentation comments in generated data type code
- Non-union DSDL types labeled `#[canadensis(enum)]` produce Rust enums instead of structs in the generated data type code

[Full changelog](https://github.com/samcrow/canadensis/blob/master/CHANGELOG.md)

---

<div class="post-metadata">

**Author:** ![samcrow](https://forum.opencyphal.org/user_avatar/forum.opencyphal.org/samcrow/32/893_2.png) [@samcrow](https://forum.opencyphal.org/u/samcrow)\
**Post date:** [September 20, 2025, 11:24pm UTC](https://forum.opencyphal.org/t/announcing-canadensis-another-rust-implementation-of-cyphal/1505/3 "2025-09-20T23:24:06Z")

</div>

I recently released canadensis 0.5.0 with some important fixes. The UDP data format is now correct, and all three transports handle the transfer-ID timeout correctly.

There’s also [a new example that runs on a microcontroller](https://github.com/samcrow/canadensis/tree/master/examples/s32k146_node).
