调用流程
前部分的调用流程如下:
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 版权协议,转载请附上原文出处链接和本声明。