在linux开发板上移植NMEA Library V0.5.3

本文介绍了如何在IMX6ULL Linux开发板上移植NMEA Library V0.5.3,以适配EC20模块的NMEA0183协议。内容包括源码下载、源码修改、添加Makefile文件以及编译和运行步骤。移植过程中特别注意了EC20模块NMEA报文的结束符与库默认设置的不同,并进行了相应调整。
摘要由CSDN通过智能技术生成

简介

NMEA Library是一个开源的NMEA0183协议解析库,包括 GPGGA, GPGSA, GPGSV, GPRMC, GPVTG等,可以在代码中修改,增加BD,GL等报文支持。

移植步骤(IMX6ULL+linux+EC20)

1,下载源码:NmeaLib v0.5.3

2,打开源码目录可以看到有以下目录
在这里插入图片描述

  include/nmea/*       头文件目录
  src/*                这里是所有的接口c文件
  samples              示例应用,有解析,生成报文,计算里程等

3,vscode打开源码目录找到src/parse/main.c文件,或者直接用vim查看。

#include <nmea/nmea.h>
#include <string.h>

int main()
{
   
    const char *buff[] = {
   
        "$GPRMC,173843,A,3349.896,N,11808.521,W,000.0,360.0,230108,013.4,E*69\r\n",
        "$GPGGA,111609.14,5001.27,N,3613.06,E,3,08,0.0,10.2,M,0.0,M,0.0,0000*70\r\n",
        "$GPGSV,2,1,08,01,05,005,80,02,05,050,80,03,05,095,80,04,05,140,80*7f\r\n",
        "$GPGSV,2,2,08,05,05,185,80,06,05,230,80,07,05,275,80,08,05,320,80*71\r\n",
        "$GPGSA,A,3,01,02,03,04,05,06,07,08,00,00,00,00,0.0,0.0,0.0*3a\r\n",
        "$GPRMC,111609.14,A,5001.27,N,3613.06,E,11.2,0.0,261206,0.0,E*50\r\n",
        "$GPVTG,217.5,T,208.8,M,000.00,N,000.01,K*4C\r\n"
    };

    int it;
    nmeaINFO info;
    nmeaPARSER parser;

    nmea_zero_INFO(&info);
    nmea_parser_init(&parser);

    for(it = 0; it < 6; ++it)
        nmea_parse(&parser, buff[it], (int)strlen(buff[it]), &info);

    nmea_parser_destroy(&parser);

    return 0;
}

看一下示例文件的调用关系,接下来我们改代码
4,源码修改
/src/parse.c文件找到int nmea_find_tail(const char *buff, int buff_sz, int *res_crc)函数,这里要改下报文的默认结束符判断语句和结束符长度,楼主使用的模组是quectel的EC20 R2.1 MINI-pciE,开始的时候解析不了是因为EC20的nmea报文是/n结束,源码默认是\r\n结束,如果你的模组输出报文也是\r\n结束,那这里不需要修改,可以直接使用。

修改结束符长度

static const int tail_sz = 3 /* *[CRC] */ + 1 /* \n */; //    

修改判断条件

if(buff + tail_sz <= end_buff && '\n' == buff[3]) /*'\r' == buff[3]) && '\n' == buff[4])*/

修改之后的代码如下:

int nmea_find_tail(const char *buff, int buff_sz, int *res_crc) {
   
    static const int tail_sz = 3 /* *[CRC] */ + 1 /* \r\n */; //

    const char *end_buff = buff + buff_sz;
    int nread = 0;
    int crc = 0;

    NMEA_ASSERT(buff && res_crc);

    *res_crc = -1;

    for(;buff < end_buff; ++buff, ++nread)
    {
   
        if(('$' 
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值