关于nmealib库的学习

  • Post author:
  • Post category:其他




调用流程

前部分的调用流程如下:

nmea_parse()
->nmea_parser_push(parser, buff, buff_sz);
	->nparsed += nmea_parser_real_push(parser, buff, nparse);
		->sen_sz = nmea_find_tail( (const char *)parser->buffer + nparsed, (int)parser->buff_use - nparsed, &crc);
			->nmea_parse_GPGGA(
                    (const char *)parser->buffer + nparsed,
                    sen_sz, (nmeaGPGGA *)node->pack))【以GPGGA为示例】


调用分为两部分:

  • 循环的将读取到的NMEA格式报文数据拷贝到parser的buffer中,每一个循环拷贝nparse个数据, 见这个函数nmea_parser_real_push;
  • 找到buffer中拷贝过来报文中的一段标准行报文的tail尾部,并进行解析,详情见这个函数nmea_parse_GPGGA。



Tips


– 解析出的链表的管理


parser中有两个指针parser->top_node和parser->end_node,用于管理解析出的信息结构体node链表,其中top_node指向链表的头部,end_node指向链表的尾部。


– parser->buffer的管理


注意在调用的前半部分,每次循环都将拷贝报文数据到parser的buffer中,但buffer的大小不是无限的,一旦发现拷贝进入buffer的数据量超出了设定大小,将清除一次buffer,可以在nmea_parser_real_push函数中看到如下语句:

if(parser->buff_use + buff_sz >= parser->buff_size)
		nmea_parser_buff_clear(parser);



版权声明:本文为DOUGDD原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。