#nmea #parser #gps #嵌入式设备

无需std nmea0183

NMEA 0183 解析器,主要针对嵌入式设备,但不仅限于

8个版本

0.4.0 2024年1月28日
0.3.1 2023年8月14日
0.3.0 2021年8月11日
0.2.3 2020年4月3日
0.1.0 2019年8月20日

#229 in 嵌入式开发

Download history 4/week @ 2024-03-10 42/week @ 2024-03-31 1/week @ 2024-04-07 1/week @ 2024-05-05 2/week @ 2024-05-19 22/week @ 2024-06-02 14/week @ 2024-06-09 23/week @ 2024-06-16 1/week @ 2024-06-23

每月60次下载
嵌入式传感器 中使用

BSD-3-Clause

67KB
1.5K SLoC

Crates.io Build Status Codecov coverage status

NMEA 0183 解析器。

实现了最常见的语句,如RMC、VTG、GGA、GLL、GSV、GSA。解析器不使用堆内存,只依赖于 core

您应使用 Parsernew 方法实例化,然后使用 parse_from_byteparse_from_bytes 等方法。如果解析器累积了足够的数据,它将返回 ParseResult 成功或描述错误的 &str

您不需要进行任何预处理,例如将数据拆分为字符串或NMEA语句。

可选功能

解析器支持与Mediatek相关的PMTKSPF非标准语句。默认情况下是禁用的。如果需要,请使用“mtk”功能。

示例

如果您可以从接收器一次读取一个字节,您可以使用 parse_from_byte

use nmea0183::{Parser, ParseResult};

let nmea = b"$GPGGA,145659.00,5956.695396,N,03022.454999,E,2,07,0.6,9.0,M,18.0,M,,*62\r\n$GPGGA,,,,,,,,,,,,,,*00\r\n";
let mut parser = Parser::new();
for b in &nmea[..] {
    if let Some(result) = parser.parse_from_byte(*b) {
        match result {
            Ok(ParseResult::GGA(Some(gga))) => { }, // Got GGA sentence
            Ok(ParseResult::GGA(None)) => { }, // Got GGA sentence without valid data, receiver ok but has no solution
            Ok(_) => {}, // Some other sentences..
            Err(e) => { } // Got parse error
        }
    }
}

如果您一次从接收器读取许多字节或想要从文本文件中解析NMEA日志,您可以使用迭代器风格

use nmea0183::{Parser, ParseResult};

let nmea = b"$GPGGA,,,,,,,,,,,,,,*00\r\n$GPRMC,125504.049,A,5542.2389,N,03741.6063,E,0.06,25.82,200906,,,A*56\r\n";
let mut parser = Parser::new();

for result in parser.parse_from_bytes(&nmea[..]) {
    match result {
        Ok(ParseResult::RMC(Some(rmc))) => { }, // Got RMC sentence
        Ok(ParseResult::GGA(None)) => { }, // Got GGA sentence without valid data, receiver ok but has no solution
        Ok(_) => {}, // Some other sentences..
        Err(e) => { } // Got parse error
    }
}

您可以选择忽略某些语句或来源。您可以在 Parser 上设置过滤器,如下所示

use nmea0183::{Parser, ParseResult, Sentence, Source};

let parser_only_gps_gallileo = Parser::new()
    .source_filter(Source::GPS | Source::Gallileo);
let parser_only_rmc_gga_gps = Parser::new()
    .source_only(Source::GPS)
    .sentence_filter(Sentence::RMC | Sentence::GGA);

恐慌

不应恐慌。如果是这样,请在该项目的页面上报告问题。

错误

不支持的语句 类型. - 获取当前不支持语句。

校验和错误! - 语句有错误的校验和,可能数据损坏。

不支持的来源! - 未知来源,新的卫星系统启动了吗? :)

NMEA 格式错误! - 可能数据损坏。解析器将丢弃所有累积的数据并开始寻找新的语句。

可能出现与其他协议错误相关的非常罕见的错误信息。现在的接收器大多不违反NMEA规范。

无运行时依赖

功能