#串行通信 #编解码器 #主机 #消息 #不同 #线 #orouter

no-std orouter-serial

oRouter 的串行协议实现

2 个版本

0.1.1 2023 年 12 月 6 日
0.1.0 2023 年 11 月 29 日

#18 in #线

MIT 许可证

59KB
1K SLoC

orouter-serial (ōRouter 串行协议)

此包提供用于主机和 oRouter 之间串行通信的强类型消息。它还包含 oRouter 中使用的不同串行硬件的编解码器。

作为线编解码器,oRouter 使用 COBS 编码,特别是 cobs rust 包,但这完全抽象了本库的用户。

对于读取消息,可以使用 crate::host::MessageReader 实例 - 创建后,可以输入字节切片(u8),当成功解码时,消息将返回到一个 crate::heapless::Vec 中。

示例

use orouter_serial::host::{
    calculate_cobs_overhead,
    codec::{UsbCodec, MAX_USB_FRAME_LENGTH},
    Message, MessageReader, StatusCode, RAWIQ_DATA_LENGTH,
};

const TEST_DATA: [u8; 4] = [0x03, 0xc5, 0x02, 0x00];

fn main() {
    let mut message_reader =
        MessageReader::<{ calculate_cobs_overhead(RAWIQ_DATA_LENGTH) }, 17>::default();
    // feed the message_reader with test data representing a Status message
    let messages = message_reader.process_bytes::<UsbCodec>(&TEST_DATA[..]).unwrap();
    println!("received messages = {:?}", messages);
    assert_eq!(
        messages.get(0),
        Some(Message::Status { code: StatusCode::FrameReceived}).as_ref()
    );
}

有关更完整的读取示例,请参阅 examples/read.rs

对于将消息编码为串行线发送,使用 crate::host::Message::encode 方法。然而,如果您知道将要使用的串行线类型(USB 或 BLE),您可以使用来自 crate::host::codec 模块的特定编解码器来使用 crate::host::Message::as_frames 方法,以获得特定串行线类型所需的帧格式。

示例

use std::str::FromStr;
use orouter_serial::host::{codec::UsbCodec, Message};

fn main() {
    // let's create a configuration message to set oRouter to EU region with spreading factor 7
    let message = Message::from_str("config@1|7").unwrap();
    // for simplicity just output the bytes
    println!("bytes = {:02x?}", message.encode().unwrap().as_slice());

    // now let's get frames for sending over USB
    let _frames = message.as_frames::<UsbCodec>().unwrap();
}

欲获取更完整的写例,请参考 examples/write.rs

Cargo features

  • std - 默认开启,暴露需要标准库(例如 Debug 属性)的内容
  • defmt-impl - 添加 defmt::Format 属性实现

依赖的内部项目

  • 命令行主机工具
  • node-overline-协议
  • RTNOrouterProtocols
  • oRouter 桌面应用程序
  • orouter-cli-miner

依赖项

~1.5MB
~27K SLoC