我正在使用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 ++中是个新手:)
谢谢马歇尔·库洛!我会为像我这样的其他初学者提供答案: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/