#gps #protocols #devices #packet #found #parser #ubx

无 std ublox

一个用于通过 UBX 协议与 u-blox GPS 设备通信的 crate

11 个版本

0.4.5 2023 年 12 月 1 日
0.4.4 2023 年 9 月 28 日
0.4.2 2022 年 4 月 30 日
0.4.1 2022 年 3 月 20 日
0.1.0 2019 年 7 月 25 日

#56硬件支持

Download history 49/week @ 2024-03-11 91/week @ 2024-03-18 143/week @ 2024-03-25 101/week @ 2024-04-01 143/week @ 2024-04-08 209/week @ 2024-04-15 219/week @ 2024-04-22 84/week @ 2024-04-29 25/week @ 2024-05-06 83/week @ 2024-05-13 59/week @ 2024-05-20 24/week @ 2024-05-27 85/week @ 2024-06-03 72/week @ 2024-06-10 71/week @ 2024-06-17 66/week @ 2024-06-24

295 每月下载
用于 2 crates

MIT 许可证

200KB
5K SLoC

uBlox for Rust

Rust ublox on docs.rs MIT licensed rustc v1.65

该项目旨在为 uBlox GPS 设备构建一个纯 Rust I/O 库,特别使用 UBX 协议。

库的使用示例可以在 examples/ 目录中找到。一个与 uBlox 设备交互的基本 CLI 可以在 examples/ublox-cli 目录中找到。请参阅具体的 examples/README

构建数据包

使用数据包的 Builder 变体来构建数据包,例如

use ublox::{CfgPrtUartBuilder, UartPortId, UartMode, DataBits, Parity, StopBits, InProtoMask, OutProtoMask};
let packet: [u8; 28] = CfgPrtUartBuilder {
   portid: UartPortId::Uart1,
   reserved0: 0,
   tx_ready: 0,
   mode: UartMode::new(DataBits::Eight, Parity::None, StopBits::One),
   baud_rate: 9600,
   in_proto_mask: InProtoMask::all(),
   out_proto_mask: OutProtoMask::UBLOX,
   flags: 0,
   reserved5: 0,
}.into_packet_bytes();

对于可变大小的数据包如 CfgValSet,您可以将其构建为新的 Vec<u8>

use ublox::{cfg_val::CfgVal::*, CfgLayer, CfgValSetBuilder};
let packet_vec: Vec<u8> = CfgValSetBuilder {
    version: 1,
    layers: CfgLayer::RAM,
    reserved1: 0,
    cfg_data: &[UsbOutProtNmea(true), UsbOutProtRtcm3x(true), UsbOutProtUbx(true)],
}
.into_packet_vec();
let packet: &[u8] = packet_vec.as_slice();

或者通过扩展现有的一个

let mut packet_vec = Vec::new();
CfgValSetBuilder {
    version: 1,
    layers: CfgLayer::RAM,
    reserved1: 0,
    cfg_data: &[UsbOutProtNmea(true), UsbOutProtRtcm3x(true), UsbOutProtUbx(true)],
}
.extend_to(&mut packet_vec);
let packet = packet_vec.as_slice();

请参阅各个 Builder 结构体的文档,了解字段信息。

解析数据包

通过实例化一个 Parser 对象,然后使用其 consume() 方法将数据添加到其中来解析数据包。解析器包含一个内部数据缓冲区,当调用 consume() 时,数据被复制到内部缓冲区,并返回一个类似迭代器的对象以访问数据包。例如

use ublox::Parser;
let mut parser = Parser::default();
let my_raw_data = vec![1, 2, 3, 4]; // From your serial port
let mut it = parser.consume(&my_raw_data);
loop {
    match it.next() {
        Some(Ok(packet)) => {
            // We've received a &PacketRef, we can handle it
        }
        Some(Err(_)) => {
            // Received a malformed packet
        }
        None => {
            // The internal buffer is now empty
            break;
        }
    }
}

无 std 支持

此库支持具有确定大小 Parser 的无 std 环境。有关更多信息,请参阅文档。

最低支持的 Rust 版本

该库将至少支持上一年度的 Rust 编译器。当前,最低支持的 Rust 版本(MSRV)是 1.65.0。注意,由于我们处于 1.0 版本之前,打破 MSRV 不会强制进行小版本更新 - MSRV 可以在补丁更新中更改。

依赖项

~3MB
~61K SLoC