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)
- 统一接口:上层通过
CanAdaptertrait 使用统一的帧类型 - 类型安全:编译时保证帧格式正确,避免原始字节操作错误
§在架构中的位置
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: u32CAN ID(标准帧或扩展帧)
data: [u8; 8]帧数据(固定 8 字节,未使用部分为 0)
len: u8有效数据长度 (0-8)
is_extended: bool是否为扩展帧(29-bit ID)
timestamp_us: u64硬件时间戳(微秒),0 表示不可用
Implementations§
Source§impl PiperFrame
impl PiperFrame
Sourcepub fn new_standard(id: u16, data: &[u8]) -> PiperFrame
pub fn new_standard(id: u16, data: &[u8]) -> PiperFrame
创建标准帧
Sourcepub fn new_extended(id: u32, data: &[u8]) -> PiperFrame
pub fn new_extended(id: u32, data: &[u8]) -> PiperFrame
创建扩展帧
Sourcepub fn data_slice(&self) -> &[u8] ⓘ
pub fn data_slice(&self) -> &[u8] ⓘ
获取数据切片(只包含有效数据)
Trait Implementations§
Source§impl Clone for PiperFrame
impl Clone for PiperFrame
Source§fn clone(&self) -> PiperFrame
fn clone(&self) -> PiperFrame
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for PiperFrame
impl Debug for PiperFrame
Source§impl<'de> Deserialize<'de> for PiperFrame
impl<'de> Deserialize<'de> for PiperFrame
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<PiperFrame, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
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
impl PartialEq for PiperFrame
Source§impl Serialize for PiperFrame
impl Serialize for PiperFrame
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
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
impl Copy for PiperFrame
impl Eq for PiperFrame
impl StructuralPartialEq for PiperFrame
Auto Trait Implementations§
impl Freeze for PiperFrame
impl RefUnwindSafe for PiperFrame
impl Send for PiperFrame
impl Sync for PiperFrame
impl Unpin for PiperFrame
impl UnwindSafe for PiperFrame
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more