#serial-communication #micro-controller #serial #packets #packet #no-std

no-std serialmessage

将串行数据打包成快速、可靠、分组的格式,以与微控制器等设备进行通信。

2个不稳定版本

0.2.0 2024年3月29日
0.1.1 2022年10月14日
0.1.0 2022年10月14日

#475 in 编码

Download history 4/week @ 2024-04-17 1/week @ 2024-05-29 1/week @ 2024-06-05

每月 98 次下载

MIT 许可证

130KB
252 代码行

Version

serialmessage

serialmessage 允许您将串行数据打包成快速、可靠、分组的格式,以与微控制器等设备进行通信。它与 Arduino SerialTransferPython pySerialTransfer 库兼容,由 PowerBroker2 提供。该软件包旨在与任何您希望使用的串行软件包一起使用,因此它本身不实现任何串行通信。此软件包是可选的完全 no_std 兼容的,可以在您选择的任何微控制器上使用。

消息格式

  • 使用起始和停止字节
  • 使用数据包标识符
  • 使用一致的冗余字节填充
  • 使用 CRC-8(多项式 0x9B,使用查找表)
  • 允许使用动态大小的数据包(数据包的有效负载长度可以从 0 到 254 字节)
  • 可以传输字节、整数、浮点数、结构体、数组、向量

数据包结构

01111110 00000000 11111111 00000000 00000000 00000000 ... 00000000 10000001
|      | |      | |      | |      | |      | |      | | | |      | |______|__Stop byte (constant)
|      | |      | |      | |      | |      | |      | | | |______|___________8-bit CRC
|      | |      | |      | |      | |      | |      | |_|____________________Rest of payload
|      | |      | |      | |      | |      | |______|________________________2nd payload byte
|      | |      | |      | |      | |______|_________________________________1st payload byte
|      | |      | |      | |______|__________________________________________# of payload bytes
|      | |      | |______|___________________________________________________COBS Overhead byte
|      | |______|____________________________________________________________Packet ID
|______|_____________________________________________________________________Start byte (constant)

示例

基本示例

use serialmessage::{SerMsg, ParseState};

let send_data_vec: Vec<u8> = vec![1, 2, 3, 4];
let send_msg = SerMsg::create_msg_vec(&send_data_vec, 1).unwrap();
// Send the message bytes with a serial crate of your choice

//Parsing received bytes
let mut ser_msg = SerMsg::new();
let (parse_state, _parsed_bytes) = ser_msg.parse_read_bytes(&send_msg);
match parse_state {
    ParseState::DataReady => {
        let rcvd_data = ser_msg.return_read_data();
        assert_eq!(&send_data_vec, rcvd_data);
    }
    _ => {
        println!("Parsestate: {:?}", parse_state);
    }
}

使用软件包提供的示例

如果您将微控制器闪存中提供的 /examples/arduino_code/ 文件夹中的代码刷入,您就可以尝试提供的示例。

cargo run --example echo your_port

该软件包的状态

当前状态

该软件包功能齐全且经过测试,我在工作中大量使用此软件包,至今没有遇到任何问题。如果您遇到问题或有疑问,请告诉我。

未来目标

  • 添加 no_std 微控制器示例
  • 添加超时解析错误

no_std 使用

禁用此软件包的默认功能即可。

依赖项