LinuxGPS RMC 获取时间,C语言解析到毫秒
时间: 2024-03-20 13:39:32 浏览: 94
在Linux下,你可以通过串口读取NMEA数据,NMEA 0183协议中包含了RMC(Recommended Minimum Specific GNSS Data)语句,其中包含了GPS定位信息和时间信息。在C语言中解析RMC语句可以使用以下代码:
``` c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void parse_rmc(char *rmc, struct tm *timeinfo, int *milliseconds) {
char *token;
int commas = 0;
token = strtok(rmc, ",");
while (token != NULL) {
if (commas == 1) {
// 获取时间字符串
char time_str[10];
strncpy(time_str, token, 6);
time_str[6] = '\0';
// 解析时间
strptime(time_str, "%H%M%S", timeinfo);
} else if (commas == 2) {
// 获取日期字符串
char date_str[10];
strncpy(date_str, token, 6);
date_str[6] = '\0';
// 解析日期
strptime(date_str, "%d%m%y", timeinfo);
// 调整年份
if (timeinfo->tm_year < 70) {
timeinfo->tm_year += 100;
}
} else if (commas == 9) {
// 获取毫秒字符串
char milliseconds_str[10];
strncpy(milliseconds_str, token, 3);
milliseconds_str[3] = '\0';
// 转换为整数
*milliseconds = atoi(milliseconds_str);
}
token = strtok(NULL, ",");
commas++;
}
}
int main() {
char rmc[] = "$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A";
struct tm timeinfo;
int milliseconds;
memset(&timeinfo, 0, sizeof(struct tm));
parse_rmc(rmc, &timeinfo, &milliseconds);
// 将时间调整为UTC时间
timeinfo.tm_hour += 2;
mktime(&timeinfo);
printf("UTC时间: %04d-%02d-%02dT%02d:%02d:%02d.%03dZ\n",
timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday,
timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, milliseconds);
return 0;
}
```
上述代码中,`parse_rmc`函数用于解析RMC语句,将解析后的时间信息存储在`struct tm`类型的结构体中,将毫秒数存储在整型指针中。`main`函数中使用了一个示例RMC语句,将解析后的时间信息转换为UTC时间并输出。
阅读全文