1.获取四个关键数据,生成gps_road.txt
功能:需要从星网宇达的GPFPD数据格式中提取经纬度、转向角以及从车辆底盘中提取速度信息(can总线中传输数据)。
#include "generate_route.h"
#include "ntzx_qianxun_inv.h"
#include "ntzx_mc.h"
#include "ntzx_timer_drv.h"
#include "ntzx_file_drv.h"
#include "ntzx_conf_app.h"
#include<string.h>
#include<stdio.h>
#include<pthread.h>
#include<math.h>
#include<unistd.h>
#define ROUTEFILE "gps_load.txt"
static FILE *g_route = NULL;
int main(int argc, char *argv[])
{
int rt;
str_inv_to_pl nav_info = {0};
str_inv_to_pl nav_info_last = {0};
str_inv_to_pl nav_info_llast = {0};
struct_mc_sta mc_sta = {0};
ntzx_systimer route;
Timer_Set(&route, 100000);
/* 初始化配置信息 */
rt = ntzx_conf_app_init();
if (rt < 0) {
printf("初始化配置信息failed\n");
return -1;
}
/* 初始化千寻惯导 */
rt = ntzx_qianxun_init();
if (rt < 0) {
printf("qianxun 初始化失败\n");
printf("%d\n",rt);
return -1;
}
/* 初始化MC底层 */
rt = ntzx_mc_usart_init();
if (rt < 0) {
printf("MC底层初始话失败");
return -1;
}
/* 初始化文件 */
rt = ntzx_file_init(ROUTEFILE, &g_route, "w");
if (g_route == NULL) {
printf("打开创建文件失败\n");
}
pthread_t thread_mc; // 底层数据处理线程
pthread_t thread_inertial_nv; // 导航(或惯导信息)处理线程
pthread_create(&thread_inertial_nv, NULL, ntzx_qianxun_inv_main, NULL);
pthread_create(&thread_mc, NULL, ntzx_mc_main, NULL);
int i = 0;
/* 采集数据 */
char tmp[1000000]; //临时保存
memset(tmp,0,sizeof(tmp));
char *p = tmp;
int start_to_break = 0;//当收到静止数据时退出保存
while (1) {
if (Timer_GetReached(&route)==0)
{
Timer_Set(&route, 100000); //采样频率,车速1m/s.
if (NTZX_QIANXUN_SUCCESS == ntzx_get_inv_to_pl(&nav_info))
{
i++;
}else{
printf("等待千寻正确数据。\n");
sleep(1);
continue;
}
ntzx_get_mc_state(&mc_sta);//获取车辆底盘状态
//将路径点信息先保存到数据里面
sprintf(p + strlen(tmp), "%.8f\n", nav_info.lat);
sprintf(p + strlen(tmp), "%.8f\n", nav_info.lon);
sprintf(p + strlen(tmp), "%f\n", nav_info.courseAngle);
sprintf(p + strlen(tmp), "%d\n", mc_sta.speed_mm / 10);
//信息点打印查看
printf("nav_info.Latitude_degree:%.10f\t\n", nav_info.lat);
printf("nav_info.Longitude_degree:%.10f\t\n", nav_info.lon);
printf("nav_info.courseAngle:%f\t\n", nav_info.courseAngle);
printf("mc_sta.speed_cm:%d\t\n", mc_sta.speed_mm / 10);
//第一种情况:当车子静止时,准备计数并退出。
if( (fabs(nav_info.lat-nav_info_llast.lat)<=0.0000002) && (fabs(nav_info.lon-nav_info_llast.lon)<=0.0000002) )
{
start_to_break++;
printf("开始停止计数:%d\t\n",start_to_break);
if (start_to_break == 1200){
printf("确认停止,结束记录路径点!\n");
break;
}
}else{
start_to_break = 0;//清零
}
nav_info_llast = nav_info_last;
nav_info_last=nav_info;//保存当前数据到历史数据
//第二种情况:当车子采集满点,退出。
if (i ==24999)
{
printf("已经保存4999组数据,退出!\n");
break;
}
}
}
printf("准备写入txt文档\n");
fprintf(g_route, "%s", tmp);
fflush(g_route);
printf("写入txt文档结束,按Ctrl +C退出!\n");
pthread_join(thread_inertial_nv, NULL);
pthread_join(thread_mc, NULL);
}
核心问题(1):分开粘在一起的字符串,打印出一串完整的GPFPD数据,然后存到数组里进行解析。
strchr()的作用是返回在recv_buf接收的数据中,首次出现‘
’
字
符
的
地
址
。
遍
历
数
组
后
到
下
一
个
′
’字符的地址。遍历数组后到下一个'
’字符的地址。遍历数组后到下一个′'字符结束,一个完整的GPFPD字符串就存放在g_qianxun_recv_buf[]中。
核心问题(2):解析GPFPD字符串
static int ntzx_gpfpd_proc(void)
{
char *p_GPFPD = NULL;
char *q_GPFPD = NULL;
int GPSWeek = 0;
int GPSTime = 0;
double Heading = 0;
double Pitch = 0;
double Roll = 0;
double lat = 0;
double lon = 0;
double alt = 0;
double ve =0;
double vn =0;
double vu =0;
double Baseline =0;
unsigned int NSV1 =0;
unsigned int NSV2 = 0;
unsigned int Status = 0;
unsigned char cs = 0;
int i = 0, j = 0;
for(i=0; i<strlen(g_qianxun_recv_data); i++)
{
if(g_qianxun_recv_data[i] == QIANXUN_SEPARATOR )
{
j++;
}
}
printf("zifuchuanzongchangdu wei:%d\n",j);
if(j!=15)
{
printf("j!= 15 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n");
return NTZX_QIANXUN_ANALYSIS_ERR;
}
p_GPFPD = strchr(g_qianxun_recv_data, '*');
if(p_GPFPD == NULL)
{
return NTZX_QIANXUN_ANALYSIS_ERR;
}
p_GPFPD = strchr(g_qianxun_recv_data, QIANXUN_SEPARATOR);
if(p_GPFPD == NULL)
{
return NTZX_QIANXUN_ANALYSIS_ERR;
}
/*HUOQU XINGQISHU*/
p_GPFPD++;
q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
*q_GPFPD = 0;
GPSWeek = (int)(atof(p_GPFPD));
printf("ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:%d\n",GPSWeek);
/*HUOQU GELINGNIZHI SHIJIAN*/
q_GPFPD++;
p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
// if (p_GPFPD == NULL) {
// return NTZX_QIANXUN_ANALYSIS_ERR;
// }
*p_GPFPD = 0;
GPSTime = atof(q_GPFPD);
printf("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS%.3lf\n",GPSTime);
p_GPFPD++;
q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
// if (q_GPFPD == NULL) {
// return NTZX_QIANXUN_ANALYSIS_ERR;
// }
*q_GPFPD = 0;
Heading = atof(p_GPFPD);
printf("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:%.3lf\n",Heading);
q_GPFPD++;
p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
// if (q_GPFPD == NULL) {
// return NTZX_QIANXUN_ANALYSIS_ERR;
// }
*p_GPFPD = 0;
Pitch = atof(q_GPFPD);
p_GPFPD++;
q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
// if (q_GPFPD == NULL) {
// return NTZX_QIANXUN_ANALYSIS_ERR;
// }
*q_GPFPD = 0;
Roll = atoi(p_GPFPD);
q_GPFPD++;
p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
// if (p_GPFPD == NULL) {
// return NTZX_QIANXUN_ANALYSIS_ERR;
// }
*p_GPFPD = 0;
lat = atof(q_GPFPD);
printf("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww:%.8lf\n",lat);
p_GPFPD++;
q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
// if (q_GPFPD == NULL) {
// return NTZX_QIANXUN_ANALYSIS_ERR;
// }
*q_GPFPD = 0;
lon = atoi(p_GPFPD);
printf("jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj:%.8lf\n",lon);
// q_GPFPD++;
// p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
// // if (p_GPFPD == NULL) {
// // return NTZX_QIANXUN_ANALYSIS_ERR;
// // }
// *p_GPFPD = 0;
// alt = atof(q_GPFPD);
// p_GPFPD++;
// q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
// // if (q_GPFPD == NULL) {
// // return NTZX_QIANXUN_ANALYSIS_ERR;
// // }
// *q_GPFPD = 0;
// ve = atoi(p_GPFPD);
// q_GPFPD++;
// p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
// // if (p_GPFPD == NULL) {
// // return NTZX_QIANXUN_ANALYSIS_ERR;
// // }
// *p_GPFPD = 0;
// vn = atof(q_GPFPD);
// p_GPFPD++;
// q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
// // if (q_GPFPD == NULL) {
// // return NTZX_QIANXUN_ANALYSIS_ERR;
// // }
// *q_GPFPD = 0;
// vu = atoi(p_GPFPD);
// q_GPFPD++;
// p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
// // if (p_GPFPD == NULL) {
// // return NTZX_QIANXUN_ANALYSIS_ERR;
// // }
// *p_GPFPD = 0;
// Baseline = atof(q_GPFPD);
// p_GPFPD++;
// q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
// // if (q_GPFPD == NULL) {
// // return NTZX_QIANXUN_ANALYSIS_ERR;
// // }
// *q_GPFPD = 0;
// NSV1 = (unsigned int)atoi(p_GPFPD);
// q_GPFPD++;
}