#xmodem #serial #zmodem #ymodem

no-std bin+lib rmodem

在无-std Rust 中实现 XMODEM (及其变体)

3 个版本

0.1.1 2024年6月26日
0.1.0 2024年6月23日
0.1.0-预发布版 2024年6月12日

嵌入式开发 中排名 205

Download history 198/week @ 2024-06-07 47/week @ 2024-06-14 306/week @ 2024-06-21 26/week @ 2024-06-28 20/week @ 2024-07-05

每月下载量 185

AGPL-3.0 或更高版本

73KB
1.5K SLoC

rmodem

纯 Rust 实现的 XMODEM 协议。

此实现的目标是支持仍在广泛使用的 XMODEM 协议的尽可能多的变体。

如果代码大小成为问题,可以通过功能门禁来禁用协议变体。

例如,默认情况下,所有实现的变体都是可用的。

要禁用默认功能,并启用 XMODEM-1K 支持

[dependencies.rmodem]
# ...
default_features = false
features = ["1k"]

无-std

默认情况下,此包是 #[no_std],使其能够在没有 stdalloc 库的环境中使用。

异常安全性

此包旨在避免显式和隐式恐慌,更喜欢有错误的函数以冒泡错误。

警告和手动代码审查将有助于这些努力。

如果您注意到会在运行时 panic 的代码,那么它是一个错误。

请提交问题或提交代码更改 :)

编译时错误,如 proc-macros 中的失败断言,不计入其中,因为它们在编译期间被捕获。

用法

作为库

use rmodem::{Control, Error, Result, Sequence, XmodemData, XmodemPacket};

// This would be a packet of data from a file in practice.
let block = [rmodem::CPMEOF; XmodemData::LEN];
let sequence = Sequence::new();

let packet = XmodemPacket::new()
    .with_sequence(sequence)
    .with_data(XmodemData::from_block(&block))
    .into_bytes();

// retry sending the packet, recommended retries is 16
match retry_packet(packet.as_ref(), 16)? {
    Control::Nak => (), // packet NAKed after retries exhausted
    Control::Ack => (), // packet ACKed, continue sending XMODEM packets
    ctrl => return Err(Error::InvalidControl(ctrl.into())), // bad response
}

有关自动检测和回退的完整示例,请参阅 cli 二进制模块。

作为二进制文件

使用 cli 功能编译项目

cargo build --features cli
# for only the original XMODEM
cargo build --features cli --no-default-features
# for all available options
cargo run --features cli -- --help

目前,CLI 应用程序支持通过串行设备发送文件

cargo run --features cli -- --file <file-path> --device <serial-tty> [--baud <baud-rate>]

进行中

当前计划是支持

  • XMODEM
  • XMODEM-1k
  • XMODEM-CRC
  • WXMODEM
  • YMODEM
  • ZMODEM

如果还有其他仍在广泛使用的变体,请提交问题或提交代码更改 :)

许可证

此代码根据 AGPL v3.0 或更高版本 许可。

依赖关系

~0–0.9MB
~14K SLoC