| Crates.io | ublox |
| lib.rs | ublox |
| version | 0.6.0 |
| created_at | 2019-07-25 13:26:54.070018+00 |
| updated_at | 2025-08-04 11:36:07.349935+00 |
| description | A crate to communicate with u-blox GPS devices using the UBX protocol |
| homepage | https://github.com/ublox-rs |
| repository | https://github.com/ublox-rs/ublox |
| max_upload_size | |
| id | 151560 |
| size | 353,663 |
ublox
This project aims to build a pure-rust I/O library for uBlox GPS devices, specifically using the UBX protocol.
The crate has originally been developed for Series 8 uBlox devices, but it is being currently adapted to support other protocol specifications and uBlox devices.
Constructing packets happens using the Builder variant of the packet, for example:
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();
For variable-size packets like CfgValSet, you can construct it into a new Vec<u8>:
use ublox::{cfg_val::CfgVal::*, CfgLayerSet, CfgValSetBuilder};
let mut buffer = Vec::new();
CfgValSetBuilder {
version: 1,
layers: CfgLayerSet::RAM,
reserved1: 0,
cfg_data: &[UsbOutProtNmea(true), UsbOutProtRtcm3x(true), UsbOutProtUbx(true)],
}
.extend_to(&mut buffer);
Or by extending to an existing one:
use ublox::{cfg_val::CfgVal::*, CfgLayerSet, CfgValSetBuilder};
let mut packet_vec = Vec::new();
CfgValSetBuilder {
version: 1,
layers: CfgLayerSet::RAM,
reserved1: 0,
cfg_data: &[UsbOutProtNmea(true), UsbOutProtRtcm3x(true), UsbOutProtUbx(true)],
}
.extend_to(&mut packet_vec);
let packet = packet_vec.as_slice();
See the documentation for the individual Builder structs for information on the fields.
Parsing packets happens by instantiating a Parser object and then adding data into it using its consume_ubx() method. The parser contains an internal buffer of data, and when consume_ubx() is called that data is copied into the internal buffer and an iterator-like object is returned to access the packets. For example:
# #[cfg(any(feature = "alloc", feature = "std"))] {
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_ubx(&my_raw_data);
loop {
match it.next() {
Some(Ok(packet)) => {
// We've received a &PacketRef, we can handle it
// Or we can convert it to an owned structure, so we can move it
let owned_packet = packet.to_owned();
}
Some(Err(_)) => {
// Received a malformed packet
}
None => {
// The internal buffer is now empty
break;
}
}
}
# }
For a list of examples and their description see the examples/ directory.
The following feature flags are available:
allocEnable usage of heap allocated Vectors from core::vec.
serdeEnable serde support.
stdEnable std support.
This library supports no_std environments with a deterministic-size Parser. See the documentation for more information.
ubx_proto14Enable support for uBlox protocol 17 messages (legacy messages).
ubx_proto23Enable support for uBlox protocol 23 messages (default).
ubx_proto27Enable support for uBlox protocol 27 messages.
ubx_proto31Enable support for uBlox protocol 31 messages.
The library crate will support at least the previous year's Rust compilers. Currently, the MSRV is 1.82.0. Note that, as we are pre-1.0, breaking the MSRV will not force a minor update - the MSRV can change in a patch update.
ublox.rs is distributed under the terms of the MIT license, see LICENSE.