|

楼主 |
发表于 2021-3-13 17:53:28
|
显示全部楼层
iar arm 使用 v8.50.9 及 v9.10.1 都试过,结果都是一样的
typedef struct _nmeaTIME
{
int Hour,Minute,Second,ms; //时,分,秒,毫秒
int Year, Month, Date; //年,月,日
int SecondBack; //更新GPS显示数据时,秒备份保存
uint8_t ConvHour; //转换后的日期数据
} GPS_TimeTypeDef;
#pragma pack(1) // 1 字节 对齐
typedef struct
{
GPS_UART_T GPS_Uart;
GPS_TimeTypeDef GPS_Time;
SatelliteInfo satinfo[38];
/* 定位有效标志, 0:未定位 1:SPS模式,定位有效 2:差分,SPS模式,定位有效 3 PS模式,定位有效 */
char isvalid; // PositionOk
uint8_t GPS_TimeUpdateFlag; //rtc时间跟新标志,=0 RTC时间跟新,否则不跟新
// uint8_t GPS_SwitchFlag; //gps开关标志,=1 表示GPS功能开启,否则关闭,
//闹钟退出函数里面调用,菜单函数
FP32 latitude;
uint8_t latNS;
FP32 longitude;
uint8_t lgtEW;
FP32 speed; //地面速度,GPS输出单位 节,Knots 已经转化位KM/H
FP32 direction; //方位角,度 ,以真北为参考
FP32 altitude; //海拔高度
uint8_t altitudeunit; //海拔单位
uint8_t FixMode; //GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算
uint8_t GSA_mode1;//定位模式,A=自动手动2D/3D,M=手动2D/3D
uint8_t GSA_mode2;//定位类型,1=未定位,2=2D定位,3=3D定位
FP32 PDOP; //综合位置精度因子
FP32 HDOP; //水平精度因子
FP32 VDOP; //垂直精度因子
uint32_t ageOfDiff;//差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
uint16_t diffStationID;//差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
uint8_t usedsat[12];//正在用来解算的卫星序号
uint8_t usedsatnum; //正在使用的卫星数量(00 - 12)
uint8_t allsatnum; //当前可见卫星总数(00 - 12)
/* VTG:地面速度信息 2019.04.30 add */
/* 样例数据:$GPVTG,309.62,T, ,M,0.13,N,0.2,K*6E */
uint16_t TrackDegTrue; /* 以真北为参考基准的地面航向(000~359度,前面的0也将被传输) */
uint16_t TrackDegMag; /* 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输) */
FP32 SpeedKnots; /* 地面速率(000.0~999.9节,前面的0也将被传输) */
FP32 SpeedKM; /* 地面速率(000.0~999.9节,前面的0也将被传输) */
uint8_t vtg_T;
uint8_t vtg_M;
uint8_t vtg_N;
uint8_t InterfaceFlag; // 进入到 gps 界面标志,=0表示没有进入到gps界面,其他值则表示已进入到gps界面 2020.11.29 add
uint8_t HardwareInitFlag; // 硬件初始化标志,=0表示硬件没有完成,=1表示硬件初始化完成
uint8_t Isvalid_OK_Flag; // 接收到数据,=0表示没有,=1表示有 2020.11.29 add
char lasttime[20];
}GPS_T;
#pragma pack() //取消对齐
void gpsGPRMC(uint8_t *_ucaBuf, uint16_t _usLen)
{
int d,m,mm;
char *word =0 ,*left = (char *)_ucaBuf;
/* 字段1 UTC时间,hhmmss.sss格式 */
//时间戳
word=split(left, ',',&left);
if(word != NULL)
{
if(strncmp(g_tGPS.lasttime,word,20))
{
sscanf(word,"%2d%2d%2d.%4d",&g_tGPS.GPS_Time.Hour,&g_tGPS.GPS_Time.Minute,&g_tGPS.GPS_Time.Second,&g_tGPS.GPS_Time.ms); // 就在这个上面
strncpy(g_tGPS.lasttime,word,20);
}
}
... ...
}
貌似把上面的函数改成如下就可以了
{
int d,m,mm;
int Hour, Minute, Second, ms;
char *word =0 ,*left = (char *)_ucaBuf;
/* 字段1 UTC时间,hhmmss.sss格式 */
//时间戳
word=split(left, ',',&left);
if(word != NULL)
{
if(strncmp(g_tGPS.lasttime,word,20))
{
// sscanf(word,"%2d%2d%2d.%4d",&g_tGPS.GPS_Time.Hour,&g_tGPS.GPS_Time.Minute,&g_tGPS.GPS_Time.Second,&g_tGPS.GPS_Time.ms);
sscanf(word,"%2d%2d%2d.%4d",&Hour,&Minute,&Second,&ms);
g_tGPS.GPS_Time.Hour = Hour;
g_tGPS.GPS_Time.Minute = Minute;
g_tGPS.GPS_Time.Second = Second;
g_tGPS.GPS_Time.ms = ms;
strncpy(g_tGPS.lasttime,word,20);
}
}
... ...
}
|
|