Skip to main content

PiperFrame

Struct PiperFrame 

Source
pub struct PiperFrame {
    pub id: u32,
    pub data: [u8; 8],
    pub len: u8,
    pub is_extended: bool,
    pub timestamp_us: u64,
}
Expand description

CAN 2.0 标准帧的统一抽象

§设计目的

PiperFrame 是协议层和硬件层之间的中间抽象,提供:

  • 层次解耦:协议层不依赖底层 CAN 实现(SocketCAN/GS-USB)
  • 统一接口:上层通过 CanAdapter trait 使用统一的帧类型
  • 类型安全:编译时保证帧格式正确,避免原始字节操作错误

§在架构中的位置

Protocol Layer (piper-protocol)
    ↓ TryFrom<PiperFrame> 解析 / new_standard() 构建
PiperFrame (此类型)
    ↓ 转换逻辑在 CAN 层实现
CAN Layer (piper-can)
    ↓ SocketCAN/GS-USB 适配器
Hardware

§设计特性

  • Copy trait:零成本复制,适合高频 CAN 场景(~1kHz 帧率)
  • 固定 8 字节:避免堆分配,减少内存碎片
  • 无生命周期:自包含数据结构,简化 API
  • 时间戳支持timestamp_us 字段支持录制/回放功能

§限制

  • 仅支持 CAN 2.0:固定 8 字节数据
  • 不支持 CAN FD:最长 64 字节的帧需要使用 PiperFrameFd(未来扩展)

§转换示例

use piper_protocol::PiperFrame;

// 创建标准帧
let frame = PiperFrame::new_standard(0x123, &[1, 2, 3, 4]);

// 创建扩展帧
let frame_ext = PiperFrame::new_extended(0x12345678, &[5, 6, 7, 8]);

// 访问数据
assert_eq!(frame.id(), 0x123);
assert_eq!(frame.data_slice(), &[1, 2, 3, 4]);

Fields§

§id: u32

CAN ID(标准帧或扩展帧)

§data: [u8; 8]

帧数据(固定 8 字节,未使用部分为 0)

§len: u8

有效数据长度 (0-8)

§is_extended: bool

是否为扩展帧(29-bit ID)

§timestamp_us: u64

硬件时间戳(微秒),0 表示不可用

Implementations§

Source§

impl PiperFrame

Source

pub fn new_standard(id: u16, data: &[u8]) -> PiperFrame

创建标准帧

Source

pub fn new_extended(id: u32, data: &[u8]) -> PiperFrame

创建扩展帧

Source

pub fn data_slice(&self) -> &[u8]

获取数据切片(只包含有效数据)

Source

pub fn id(&self) -> u32

获取 CAN ID

Source

pub fn data(&self) -> &[u8; 8]

获取完整数据(8字节固定数组)

Trait Implementations§

Source§

impl Clone for PiperFrame

Source§

fn clone(&self) -> PiperFrame

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PiperFrame

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for PiperFrame

Source§

fn deserialize<__D>( __deserializer: __D, ) -> Result<PiperFrame, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for PiperFrame

Source§

fn eq(&self, other: &PiperFrame) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for PiperFrame

Source§

fn serialize<__S>( &self, __serializer: __S, ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for PiperFrame

Source§

impl Eq for PiperFrame

Source§

impl StructuralPartialEq for PiperFrame

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,