Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux下利用gps时间戳结构设置系统时间_C++_Linux_Gps_Gpsd - Fatal编程技术网

C++ Linux下利用gps时间戳结构设置系统时间

C++ Linux下利用gps时间戳结构设置系统时间,c++,linux,gps,gpsd,C++,Linux,Gps,Gpsd,Linux下利用gps时间戳结构设置系统时间 大家好, 我正在尝试编写代码,一旦我成功获得GPS锁(Adafruit Ultimate GPS w/GPSD),我就会设置系统时间。现在,我可以看到“时间戳”: typedef double timestamp_t; /* Unix time in seconds with fractional part */ 是我的“gps数据”结构的一部分。这是一个很好的开始,但是,我计划在Linux中使用的设置系统时间的函数是: int settimeof

Linux下利用gps时间戳结构设置系统时间

大家好,

我正在尝试编写代码,一旦我成功获得GPS锁(Adafruit Ultimate GPS w/GPSD),我就会设置系统时间。现在,我可以看到“时间戳”:

typedef double timestamp_t; /* Unix time in seconds with fractional part */
是我的“gps数据”结构的一部分。这是一个很好的开始,但是,我计划在Linux中使用的设置系统时间的函数是:

int settimeofday(const struct timeval *tv, const struct timezone *tz);
我找到了关于如何将time\u t转换为*timeval的信息,但是我应该如何处理这个double来将其转换为*timeval

代码:

这幅画更清晰吗


相反,这正是我的应用程序所需要的:

//Convert gps_data_t* member 'time' to timeval
timeval tv;
double wholeseconds, decimalseconds;
decimalseconds = modf(newdata->time, &wholeseconds);
tv.sec = static_cast<int32_t>(wholeseconds);
tv.usec = static_cast<int32_t>(decimalseconds * 1000000.0);

//Create timezone
timezone tz{ timezone(300, DST_USA)};

//Set system time
settimeofday(&tv, &tz);
//将gps数据*成员“time”转换为timeval
蒂梅瓦尔电视;
双整秒,小数秒;
小数秒=modf(新数据->时间和整秒);
tv.sec=静态播放(整秒);
tv.usec=静态广播(小数秒*1000000.0);
//创建时区
时区tz{时区(300,美国东部时间)};
//设置系统时间
设置每日时间(&tv,&tz);
在这里:

//Get first data to set system time
struct gps_data_t* firstdata;

//Loop until first GPS lock to set system time
while (((firstdata = gps_rec.read()) == NULL) ||
        (firstdata->fix.mode < 1)) {
    //Do nothing
}

//Convert gps_data_t* member 'time' to timeval
timeval tv;
double wholeseconds, decimalseconds, offsettime;
offsettime = firstdata->fix.time - (5.0 * 3600.0);  //5hr offset from GMT
decimalseconds = modf(offsettime, &wholeseconds);
tv.tv_sec = static_cast<int32_t>(wholeseconds);
tv.tv_usec = static_cast<int32_t>(decimalseconds * 1000000.0);

//Set system time
if ( settimeofday(&tv, NULL) >= 0) {
    std::cout << "Time set succesful!" << '\n';
} else {
    std::cout << "Time set failure!" << '\n';
}
//获取第一个数据以设置系统时间
结构gps_数据_t*firstdata;
//循环直到第一次GPS锁定,以设置系统时间
而(((firstdata=gps_rec.read())==NULL)||
(firstdata->fix.mode<1)){
//无所事事
}
//将gps_数据_t*成员“time”转换为timeval
蒂梅瓦尔电视;
双整秒,小数秒,业余时间;
offsettime=firstdata->fix.time-(5.0*3600.0)//距格林尼治标准时间5小时的偏移量
小数秒=modf(偏移时间和整秒);
tv.tv_sec=静态播放(整秒);
tv.tv_usec=静态广播(小数秒*1000000.0);
//设置系统时间
如果(settimeofday(&tv,NULL)>=0){
标准::cout这里是:

//Get first data to set system time
struct gps_data_t* firstdata;

//Loop until first GPS lock to set system time
while (((firstdata = gps_rec.read()) == NULL) ||
        (firstdata->fix.mode < 1)) {
    //Do nothing
}

//Convert gps_data_t* member 'time' to timeval
timeval tv;
double wholeseconds, decimalseconds, offsettime;
offsettime = firstdata->fix.time - (5.0 * 3600.0);  //5hr offset from GMT
decimalseconds = modf(offsettime, &wholeseconds);
tv.tv_sec = static_cast<int32_t>(wholeseconds);
tv.tv_usec = static_cast<int32_t>(decimalseconds * 1000000.0);

//Set system time
if ( settimeofday(&tv, NULL) >= 0) {
    std::cout << "Time set succesful!" << '\n';
} else {
    std::cout << "Time set failure!" << '\n';
}
//获取第一个数据以设置系统时间
结构gps_数据_t*firstdata;
//循环直到第一次GPS锁定,以设置系统时间
而(((firstdata=gps_rec.read())==NULL)||
(firstdata->fix.mode<1)){
//无所事事
}
//将gps_数据_t*成员“time”转换为timeval
蒂梅瓦尔电视;
双整秒,小数秒,业余时间;
offsettime=firstdata->fix.time-(5.0*3600.0);//距GMT的5小时偏移量
小数秒=modf(偏移时间和整秒);
tv.tv_sec=静态播放(整秒);
tv.tv_usec=静态广播(小数秒*1000000.0);
//设置系统时间
如果(settimeofday(&tv,NULL)>=0){

std::cout首先,仅仅因为函数需要指向结构的指针,并不意味着你必须将变量声明为指针。你必须在某个地方读到运算符
&
的地址。至于你的问题,你试过了吗?它告诉你结构是什么样子的。是的,我不认为混淆的是什么settimeofday函数需要,它对timeval的结构非常清楚。它是来自gps数据的timestamp_t结构,我不太了解。但是,我刚刚找到了非常有用的链接,我将不得不尝试。我猜timestamp_t类似于time_t,但作为一个双精度,它有一个分数分量,等于秒的分数,这在这个应用程序中并不重要。这可能是缺少的部分。看看那篇文章,在计算小数部分之前,你必须将
time.tv\u usec
转换为double,比如
timestamp+=((double)time.tv\u usec/1000000.0L)
。但就我对您的问题的理解而言,您希望将
timestamp\u t timestamp
值转换为
timeval time
。首先,函数需要指向结构的指针并不意味着您必须将变量声明为指针。您必须阅读有关运算符
地址的信息&某个地方。至于你的问题,你试过了吗?它告诉你结构是什么样子的。是的,我不认为困惑在于settimeofday函数需要什么,它在timeval的结构上非常清楚。这是来自gps数据的时间戳结构,我不太明白。但是,我刚刚找到了链接,它是非常有帮助,我将不得不尝试。我猜时间戳与时间类似,但作为一个双精度,它有一个分数分量,相当于秒的分数,这在这个应用程序中并不重要。这可能是缺少的部分。看看那篇文章,在计算分贝之前,你必须将
time.tv\u usec
转换为双精度所有部分,如
timestamp+=((double)time.tv\u usec/1000000.0L)
。但在我理解您的问题时,您希望将
timestamp\u t timestamp
值转换为
timeval time
//Get first data to set system time
struct gps_data_t* firstdata;

//Loop until first GPS lock to set system time
while (((firstdata = gps_rec.read()) == NULL) ||
        (firstdata->fix.mode < 1)) {
    //Do nothing
}

//Convert gps_data_t* member 'time' to timeval
timeval tv;
double wholeseconds, decimalseconds, offsettime;
offsettime = firstdata->fix.time - (5.0 * 3600.0);  //5hr offset from GMT
decimalseconds = modf(offsettime, &wholeseconds);
tv.tv_sec = static_cast<int32_t>(wholeseconds);
tv.tv_usec = static_cast<int32_t>(decimalseconds * 1000000.0);

//Set system time
if ( settimeofday(&tv, NULL) >= 0) {
    std::cout << "Time set succesful!" << '\n';
} else {
    std::cout << "Time set failure!" << '\n';
}