#sensor #wire #data #friends #mems #format #transmitting

无std serial-sensors-proto-derive

用于传输MEMS传感器数据和友元的一种简单的线格式

13个不稳定版本 (3个重大更新)

0.4.0 2024年7月6日
0.3.0 2024年7月5日
0.2.3 2024年7月4日
0.1.0 2024年7月3日

#21 in #friends

Download history 421/week @ 2024-06-27 649/week @ 2024-07-04 22/week @ 2024-07-11 22/week @ 2024-07-18 53/week @ 2024-07-25 45/week @ 2024-08-01

每月下载量144次
serial-sensors-proto中使用

EUPL-1.2

17KB
266 代码行

serial-sensors-proto

用于传输MEMS传感器数据和友元的一种简单的线格式。

Crates.io Docs Build Status Safety Dance codecov MSRV EUPL 1.2 licensed

方法有两步

  • 协议在传感器和数据类型上略微可扩展,支持1、3和4维读取。
  • 首先使用bincode序列化数据包,然后使用corncobs(即使用一致的冗余字节填充,COBS)进行字节填充。

在接收端,整个过程相反运行。

除了支持一些通用的传感器类型,如加速度计、磁力计、陀螺仪等之外,格式还有一些自我描述的能力。如果实现,传感器制造商和名称以及线性归一化因子可以一次或定期通过线发送,从而允许主机进行自动和传感器无关的转换。


参见stm32f3disco-rustserial-sensors示例。以下是该项目的一个示例屏幕截图,显示了传感器数据的流动

An example output from serial-sensors TUI

设备端代码可以像这样简单

fn example() {
    let value = AccelerometerI16::new(Vector3Data { x: 1, y: -2, z: 3 });
    let frame = Version1DataFrame::new(u32::MAX, 12, 0, value);

    // Serialize into a transmit buffer.
    let mut buffer = [0_u8; 48];
    let buffer = serialize(frame, &mut buffer).unwrap();
    assert_eq!(buffer.len(), 21);

    // ... send the buffer over the wire ...

    // Deserialization the received buffer.
    let data = deserialize(buffer).unwrap();
    assert_eq!(data.version, Version1);
    assert_eq!(data.data.global_sequence, u32::MAX);
    assert_eq!(data.data.sensor_sequence, 12);
    assert_eq!(data.data.sensor_tag, 0);

    let data: AccelerometerI16 = data.try_into().unwrap();
    assert_eq!(data.x, 1);
    assert_eq!(data.y, -2);
    assert_eq!(data.z, 3);
}

依赖项

~0.6–1MB
~24K SLoC