ins的一个代码解析片段

该代码段涉及GPS和惯性导航系统(INS)的数据解析和时间转换。`ProtocolTranslateChar_NORMAL_55AA_SUMNOHEAD`函数处理数据帧的解析,检查55AA帧头并进行校验。同时,`GPSTime_To_UTC`函数将GPS时间转换为UTC时间。结构体`INS_STATE`定义了惯导输出的数据结构,包括时间、位置、速度等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

INS解析

static void ProtocolTranslateChar_NORMAL_55AA_SUMNOHEAD(PMYPROTOCOLDATA pData, uint8_t nCh)
{
	pData->pPROTOCOL[pData->nProtocolPos++] = nCh;
	if(pData->nProtocolPos == 1)
	{
		if(pData->pPROTOCOL[0] != 0x55)
			pData->nProtocolPos = 0;
	}
	else if(pData->nProtocolPos == 2)
	{
		if(pData->pPROTOCOL[1] == 0x55)
			pData->nProtocolPos = 1;
		else if(pData->pPROTOCOL[1] != 0xAA)
			pData->nProtocolPos = 0;
	}
	else if(pData->nProtocolPos >= pData->sParam.PROTOCOLSIZE)
	{
		int i = 0;
		uint8_t nCheck = 0;
		//复位指针
		pData->nProtocolPos = 0;
		for(i = 2; i < pData->sParam.PROTOCOLSIZE - 1; i++)
		{
			nCheck += pData->pPROTOCOL[i];
		}
		if(nCheck == pData->pPROTOCOL[pData->sParam.PROTOCOLSIZE - 1])//校验正确,响应数据
		{
			if(pData->sParam.CallBack)
				pData->sParam.CallBack(pData->sParam.PARAM, pData->pPROTOCOL, pData->sParam.PROTOCOLSIZE);
		}
		else//校验不正确,重新查找帧头
		{
			for(i = 2; i < pData->sParam.PROTOCOLSIZE; i++)
			{
				//迭代法进行重新查找帧头
				ProtocolTranslateChar_NORMAL_55AA_SUMNOHEAD(pData, pData->pPROTOCOL[i]);
			}
		}
	}
}



//惯导输出数据结构
#pragma pack(push)
#pragma pack(1)
typedef struct __tagINS_STATE
{
		uint8_t head0;                //0x55
    uint8_t head1;                //0xAA
    uint8_t FrameId;              //帧标识
//    double UTCTime;             //UTC时间
    uint8_t  year;
    uint8_t  mouth;
    uint8_t  day;
    uint8_t  hour;
    uint8_t  minutes;
    uint8_t  seconds;
    uint16_t milliseconds;
    //UTC time
    uint8_t GPSId;                //GPS 定位标识,0:无效 1:单点 2:伪距差分 3:RTK差分
    uint8_t InitId;               //初始启动标志
    uint8_t SateNum;              //卫星数目
    //组合导航状态位 0:待机 1:对准 5:零速校正 6:纯惯导  7:惯导/GNSS组合导航 8:惯导/轮速计组合导航   9: 惯导/SLAM组合导航;10:故障
    uint8_t NavState;
    float GPSEastSpeed;         //GPS东向速度
    float GPSNorthSpeed;        //GPS北向速度
    float GPSSkySpeed;          //GPS天向速度
    long NavLongitude;          //导航经度
		long NavLatitude;           //导航纬度
    float GPSHeight;            //GPS高度
    float NavHeadAngle;        //导航航向角
//    double INSDataTime;         //惯导数据时间
    uint32_t wheelspeedmeter;     //wheelspeed
    uint32_t INSDataTime;         //惯导数据时间
    float HormSpeedX;           //角速度X
    float HormSpeedY;           //角速度Y
    float HormSpeedZ;           //角速度Z,左为正
    float AccelerationX;        //加速度X
    float AccelerationY;        //加速度Y
    float AccelerationZ;        //加速度Z
    float NavEastSpeed;         //导航东向速度
    float NavNorthSpeed;        //导航北向速度
    float NavUpSpeed;          //导航天向速度
    long GPSLongitude;          //GPS经度,比例尺1e-7
    long GPSLatitude;           //krnws/GPS纬度,比例尺1e-7
    float GPSAngle;             //GPS航角度
    float NavPitchAngle;        //导航俯仰角
    float NavRollAngle;         //导航滚转角
    uint8_t checksum;
}INS_STATE,*PINS_STATE;
#pragma pack(pop)`在这里插入代码片`

GPS2UTC


//dLeapSecong  闰秒 填-18

void GPSTime_To_UTC(double dGpsWeek, double dGpsSecond, double dLeapSecong)
{

	int32_t Localzone = 8;  //时区

//	char GPSTimeToUTC[99] = {'\0'};

	int nYear, nMonth, nDay, nHour, nMinute, nSecond;
	int tm_shi = 0;   int tm_fen = 0;   int tm_miao = 0;   int tm_hmiao = 0;
	int iTianshu = 0;
	
	int startyear = 1980;
	int startmonth = 1;
	int startday = 6;

	int iGpsZh = (int)dGpsWeek;
	double iGpsMi = dGpsSecond;
	int GYM_LeapSecong = (int)dLeapSecong;
        double dSecToDay = 0.0;
 
	iGpsMi = iGpsMi + GYM_LeapSecong + Localzone*3600;  
	
	if(iGpsMi<0)
	{
	 iGpsMi += 604800;
	 iGpsZh = iGpsZh - 1;
	}
	else if(iGpsMi>=604800)
	{
	 iGpsMi -= 604800;
	 iGpsZh = iGpsZh + 1;
	}
	
	

	dSecToDay = floor(iGpsMi/3600.0/24.0);
	tm_shi = (int)floor((iGpsMi - dSecToDay*3600.0*24.0)/3600.0);
	tm_fen = (int)floor((iGpsMi - dSecToDay*3600.0*24.0 - tm_shi*3600.0)/60.0);
	tm_miao = (int)floor(iGpsMi - dSecToDay*3600.0*24.0 - tm_shi*3600.0 - tm_fen*60.0);
	tm_hmiao = (int)((iGpsMi-(int)iGpsMi)*100);
	iTianshu = iGpsZh*7 + (int)dSecToDay;
	while(iTianshu>0)
	{
		switch(startmonth)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
			startday++;
			if(startday>31)
			{
				startday = 1;
				startmonth++;
			}
			break;
		case 12:
			startday++;
			if(startday>31)
			{
				startday = 1;
				startmonth = 1;
				startyear++;
			}
			break;
		case 2:
			if((startyear%400==0)||(((startyear%4)==0)&&((startyear%100)!=0)))
			{
				startday++;
				if(startday>29)
				{
					startday = 1;
					startmonth ++;
				}
			}
			else
			{
				startday++;
				if(startday>28)
				{
					startday = 1;
					startmonth ++;
				}
			}
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			startday++;
			if(startday>30)
			{
				startday = 1;
				startmonth++;
			}
			break;
		}
		iTianshu--;
    }
	nYear = startyear;
	nMonth = startmonth;
	nDay = startday;
	nHour = tm_shi;
	nMinute = tm_fen;
	nSecond = tm_miao;
	

	printf("\n%d%02d%02d,%02d%02d%02d.%d\n",nYear, nMonth, nDay, nHour, nMinute, nSecond,tm_hmiao);
//	sprintf(GPSTimeToUTC, "\n%d%02d%02d,%02d%02d%02d.%d\n",nYear, nMonth, nDay, nHour, nMinute, nSecond,tm_hmiao);
//	return GPSTimeToUTC;
		
}	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值