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

no-std serial-sensors-proto

用于传输MEMS传感器数据及其相关信息的简单线格式

5个版本 (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日

#215硬件支持

Download history 644/week @ 2024-06-29 339/week @ 2024-07-06 16/week @ 2024-07-13 23/week @ 2024-07-20 51/week @ 2024-07-27 51/week @ 2024-08-03 19/week @ 2024-08-10 37/week @ 2024-08-17

每月下载量:159

EUPL-1.2

60KB
1.5K SLoC

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);
}

依赖项

~1–1.7MB
~37K SLoC