yincheng.zhong
8 天以前 68c43c5adef03f00836d83b37cb83a294d8b0354
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/*******************************************************************************
 * File Name         : GPS_Usage_Example.c
 * Description       : GPRMI和GPIMU数据解析使用示例
 * Created on        : 2025年11月11日
 * Author            : www.hido-studio.com
 *******************************************************************************/
 
#include "GPS.h"
#include <stdio.h>
 
/*******************************************************************************
 * Function Name     : Example_ReadGPRMI
 * Description       : 读取GPRMI数据示例
 * Input             : None
 * Output            : None
 * Return            : None
 *******************************************************************************/
void Example_ReadGPRMI(void)
{
    ST_GPRMI stGPRMI;
    
    // 获取最新的GPRMI数据
    if (GPS_GetGPRMI(&stGPRMI) == HIDO_OK)
    {
        // 数据有效,可以使用
        printf("GPRMI数据:\r\n");
        printf("  UTC时间: %u (hhmmss.ss*100)\r\n", stGPRMI.m_u32UTCTime);
        printf("  周数: %u\r\n", stGPRMI.m_u16WeekNumber);
        printf("  周内秒: %u ms\r\n", stGPRMI.m_u32TimeOfWeek);
        printf("  纬度: %.8f°\r\n", stGPRMI.m_dLatitude);
        printf("  经度: %.8f°\r\n", stGPRMI.m_dLongitude);
        printf("  高程: %.3f m\r\n", stGPRMI.m_fAltitude);
        printf("  东向速度: %.3f m/s\r\n", stGPRMI.m_fEastVelocity);
        printf("  北向速度: %.3f m/s\r\n", stGPRMI.m_fNorthVelocity);
        printf("  天顶速度: %.3f m/s\r\n", stGPRMI.m_fUpVelocity);
        printf("  定位质量: %u (0=无效,1=单点,2=差分,4=固定,5=浮点)\r\n", stGPRMI.m_u8PositionQuality);
        printf("  可见卫星数: %u\r\n", stGPRMI.m_u8SatelliteCount);
        printf("  基线距离: %.3f m\r\n", stGPRMI.m_fBaselineDistance);
    }
    else
    {
        printf("GPRMI数据无效或未接收\r\n");
    }
}
 
/*******************************************************************************
 * Function Name     : Example_ReadGPIMU
 * Description       : 读取GPIMU数据示例
 * Input             : None
 * Output            : None
 * Return            : None
 *******************************************************************************/
void Example_ReadGPIMU(void)
{
    ST_GPIMU stGPIMU;
    
    // 获取最新的GPIMU数据
    if (GPS_GetGPIMU(&stGPIMU) == HIDO_OK)
    {
        // 数据有效,可以使用
        printf("GPIMU数据:\r\n");
        printf("  UTC时间: %u (hhmmss.sss)\r\n", stGPIMU.m_u32UTCTime);
        printf("  X轴加速度: %.3f g\r\n", stGPIMU.m_fAccelX);
        printf("  Y轴加速度: %.3f g\r\n", stGPIMU.m_fAccelY);
        printf("  Z轴加速度: %.3f g\r\n", stGPIMU.m_fAccelZ);
        printf("  X轴角速度: %.3f °/s\r\n", stGPIMU.m_fGyroX);
        printf("  Y轴角速度: %.3f °/s\r\n", stGPIMU.m_fGyroY);
        printf("  Z轴角速度: %.3f °/s\r\n", stGPIMU.m_fGyroZ);
        printf("  传感器温度: %.2f ℃\r\n", stGPIMU.m_fTemperature);
        printf("  校验和: 0x%02X\r\n", stGPIMU.m_u8Checksum);
    }
    else
    {
        printf("GPIMU数据无效或未接收\r\n");
    }
}
 
/*******************************************************************************
 * Function Name     : Example_PeriodicRead
 * Description       : 定期读取GPS数据的示例(在应用层任务中调用)
 * Input             : None
 * Output            : None
 * Return            : None
 *******************************************************************************/
void Example_PeriodicRead(void)
{
    static HIDO_UINT32 lastReadTick = 0;
    HIDO_UINT32 currentTick = HIDO_TimerGetTick();
    
    // 每1000ms读取一次
    if ((currentTick - lastReadTick) >= 1000)
    {
        lastReadTick = currentTick;
        
        ST_GPRMI stGPRMI;
        ST_GPIMU stGPIMU;
        
        // 读取定位数据
        if (GPS_GetGPRMI(&stGPRMI) == HIDO_OK)
        {
            // 处理定位数据
            // 例如:更新地图位置、计算速度等
            if (stGPRMI.m_u8PositionQuality >= 4)  // 固定解或浮点解
            {
                // 高精度定位可用
                // 可以进行精确导航
            }
        }
        
        // 读取IMU数据
        if (GPS_GetGPIMU(&stGPIMU) == HIDO_OK)
        {
            // 处理IMU数据
            // 例如:姿态估计、运动检测等
            
            // 计算总加速度
            float totalAccel = sqrt(
                stGPIMU.m_fAccelX * stGPIMU.m_fAccelX +
                stGPIMU.m_fAccelY * stGPIMU.m_fAccelY +
                stGPIMU.m_fAccelZ * stGPIMU.m_fAccelZ
            );
            
            // 检测设备是否在运动
            if (totalAccel > 1.1f || totalAccel < 0.9f)  // 不在静止状态
            {
                // 设备正在运动
            }
        }
    }
}
 
/*******************************************************************************
 * 数据格式说明
 *******************************************************************************
 * 
 * (1) GPRMI - GPS/INS组合定位数据
 * 格式: $GPRMI,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,<13>,<14>,<15>,<16>,<17>,<18>,<19>,<20>,<21>,<22>,<23>*<校验和><CR><LF>
 * 
 * 字段说明:
 * <1>  UTC时间, 格式为 hhmmss.ss
 * <2>  Week number, 周数
 * <3>  Time of week, 周内秒, 格式为 ss.mmm
 * <4>  纬度(°), 正数为北纬
 * <5>  经度(°), 正数为西经
 * <6>  高程(m)
 * <7>  纬度标准差(m)
 * <8>  经度标准差(m)
 * <9>  高程标准差(m)
 * <10> 东方向上的速度(m/s)
 * <11> 北方向上的速度(m/s)
 * <12> 天顶方向的速度(m/s)
 * <13> 水平速度标准差(m/s)
 * <14> 俯仰角(°)
 * <15> 侧倾角(°)
 * <16> 翻滚角(°)
 * <17> 俯仰角标准差(°)
 * <18> 侧倾角标准差(°)
 * <19> 翻滚角标准差(°)
 * <20> 基线距离(m)
 * <21> 天线可见卫星数量
 * <22> 载波整周固定模糊值个数
 * <23> 定位质量指示: 0=无效, 1=单点, 2=差分, 4=固定, 5=浮点, 6=惯导
 * 
 * 
 * (2) GPIMU - IMU传感器数据
 * 格式: $GPIMU,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>*<CR><LF>
 * 
 * 字段说明:
 * <1> UTC时间, 格式为 hhmmss.sss
 * <2> x轴加速度(g)
 * <3> y轴加速度(g)
 * <4> z轴加速度(g)
 * <5> 陀螺x轴角速度(°/s)
 * <6> 陀螺y轴角速度(°/s)
 * <7> 陀螺z轴角速度(°/s)
 * <8> 传感器温度(℃)
 * <9> 异或校验和
 * 
 * 示例数据:
 * $GPIMU, 054752.002, 0.000, 0.007, -1.032, -0.003, 0.053, -0.016,26.00@59
 * 
 *******************************************************************************/