C ++ Raspberry PI 4,“ chrono”未使用Geany进行编译

问题描述 投票:-1回答:1

我正在使用Raspberry pi 4(rip Pi3)的机器人项目使用C ++。为了计算电动机的转速,我尝试使用“ chrono”库,因为它可以提供一定的精度。

[当我尝试编译时,出现错误错误“无法转换”:

gg++ -Wall -c "GPIORegistresSpeedMeter.cpp" -lwiringPi (in directory: /home/pi/zepeu/Test)
GPIORegistresSpeedMeter.cpp: In function ‘void RPMCounter()’:
GPIORegistresSpeedMeter.cpp:51:59: error: cannot convert ‘std::chrono::_V2::system_clock::time_point’ {aka ‘std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long int, std::ratio<1, 1000000000> > >’} to ‘int’ in assignment
  EndMeasurement = std::chrono::high_resolution_clock::now();
                                                           ^
GPIORegistresSpeedMeter.cpp:54:61: error: cannot convert ‘std::chrono::_V2::system_clock::time_point’ {aka ‘std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long int, std::ratio<1, 1000000000> > >’} to ‘int’ in assignment
  BeginMeasurement = std::chrono::high_resolution_clock::now();
                                                             ^
GPIORegistresSpeedMeter.cpp:57:61: error: cannot convert ‘std::chrono::_V2::system_clock::time_point’ {aka ‘std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long int, std::ratio<1, 1000000000> > >’} to ‘int’ in assignment
  BeginMeasurement = std::chrono::high_resolution_clock::now();
                                                             ^
Compilation failed.

我当然是在互联网上搜索的,但是没有成功……我没有找到与此计时相关的错误或任何有用信息的任何信息。

我试图更新c ++库,它没有做任何改变,我检查了其他编写代码的方法,没有帮助我更新了Geany,它已经是最新的了我更新/升级了我的树莓派,它已经是最新的了我显然拥有最新的g ++版本,即8.3.0

这里是代码,它寻址移位寄存器电路(串行到并行转换器):

#include <iostream>
#include <wiringPi.h>
#include <cstdio>
#include <csignal>
#include <ctime>
#include <chrono>

// global flag used to exit from the main loop
bool RUNNING = true;
bool StartTimer = false;
int RPMMeasurement = 0;
int BeginMeasurement = 0;
int EndMeasurement = 0;

// sends the data to the shift register
void SendData(int Array[16]) {
    int SPser = 13, SPclk = 19, SPrclk = 26; //Define the pins used
    int time = 10;   // interval at which a pin is turned HIGH/LOW

    for(int DataI=0; DataI<=15; DataI=DataI+1){
    if (Array[DataI]==1){
        digitalWrite(SPser, HIGH);  //change to a HIGH level if 1
        delay(time);
    }
    else{
        digitalWrite(SPser, LOW);   //changes to a low level if 0
        delay(time);
    }
    digitalWrite(SPclk, HIGH);
    delay(time);
    digitalWrite(SPclk, LOW);
    delay(time);
    }
    digitalWrite(SPrclk, HIGH);
    delay(time);
    digitalWrite(SPrclk, LOW);
    std::cout << "SPrclk " <<'\n';
    delay(1000);
}

// Callback handler if CTRL-C signal is detected
void my_handler(int s) {
    std::cout << "Detected CTRL-C signal no. " << s << '\n';
    RUNNING = false;
}

//interruption function called
void RPMCounter(){
    std::cout << "Counting RPM" << '\n';
    if (StartTimer == true){
    EndMeasurement = std::chrono::high_resolution_clock::now();
    RPMMeasurement = EndMeasurement - BeginMeasurement;
    std::cout << "RPM Time = " << RPMMeasurement << '\n';
    BeginMeasurement = std::chrono::high_resolution_clock::now();
    }
    else{
    BeginMeasurement = std::chrono::high_resolution_clock::now();
    StartTimer = true;
    }
}

//###################################################################################
int main() {
    // Initialize wiringPi and allow the use of BCM pin numbering
    wiringPiSetupGpio();

    // Define the pins we are going to use, names are the GPIO numbers and not the pins numbers
    int SPser = 13, SPclk = 19, SPrclk = 26, Button = 17;

    // Setup the pins
    pinMode(SPser, OUTPUT);
    pinMode(SPclk, OUTPUT);
    pinMode(SPrclk, OUTPUT);
    pinMode(Button, INPUT);

    //Button interruption
    wiringPiISR (Button, INT_EDGE_RISING, RPMCounter); //call the interruption on the button nb 17

    // Register a callback function to be called if the user presses CTRL-C
    std::signal(SIGINT, my_handler);
    int DataArr[16]={}; //create the array of data
    int i = 0; //initialize the value for counter
    int j = 0;

    while(RUNNING) {
    for( i = 0; i <= 15; i++ ){
        std::cout << "data input i =" << i << '\n';
        if (i==0){
            std::cout << "if array " << i << '\n';
            DataArr[i]=1;
            DataArr[15]=0;
        }
        else{
            j=i-1;
            DataArr[j]=0;
            DataArr[i]=1;
            std::cout << "in else i" << i << " and j " << j << '\n';
        }
    SendData(DataArr);
    }

    }

    std::cout << "Program ended ...\n";
}

有人可以解释怎么了吗?我在Linux(树莓派)和C ++中是个新手:)

compiler-errors compilation g++ chrono geany
1个回答
-1
投票

谢谢马歇尔·库洛!我会为像我这样的其他初学者提供答案:p

正如他所说,“ now”(当然还有大多数chrono函数)不会返回整数,也不是双精度值,而是一个包含多个数据的对象。

我的代码如下:

//interruption function called
void RPMCounter(){
    using namespace std::chrono;
    std::cout << "Counting RPM" << '\n';
    if (StartTimer == true){
    high_resolution_clock::time_point BeginMeasurement;
    high_resolution_clock::time_point EndMeasurement;
    EndMeasurement = high_resolution_clock::now();
    duration<double> time_span = duration_cast<duration<double>>(EndMeasurement - BeginMeasurement);
    //std::cout << "RPM Time = " << RPMMeasurement << '\n';
    BeginMeasurement = high_resolution_clock::now();
    }
    else{
    high_resolution_clock::time_point BeginMeasurement;
    BeginMeasurement = high_resolution_clock::now();
    StartTimer = true;
    }
}```

"high_resolution_clock::time_point" being the variable type (as an Int or double)

more info :
[high_resolution_clock] : http://www.cplusplus.com/reference/chrono/high_resolution_clock/
[now] : http://www.cplusplus.com/reference/chrono/high_resolution_clock/now/
[time_point][3] : http://www.cplusplus.com/reference/chrono/time_point/

© www.soinside.com 2019 - 2024. All rights reserved.