问题
我有一个问题,如果我使用sudo运行程序,我不会得到所需的输出,但如果我在没有sudo的情况下运行,它会正常工作。我使用的是带有c++的树莓派,使用wiringPi访问GPIO。该程序最终将涉及使用PWM引脚来设置电机功率,为此布线Pi需要使用sudo。因此,我需要在运行此程序时使用sudo。
然而,任何使用我正在使用的代码从编码器中获取读数的程序如果使用sudo运行都不起作用,但其他一切都可以使用sudo。例如,如果我使用sudo运行BETA/basicInchTest.cpp、My own encoder/workingInOneFile.cpp或My own编码器/test.cpp,它们将只打印0,但如果我在没有sudo的情况下运行,它们将给出所需的输出,打印编码器的位置。如果我运行除了那些处理编码器的程序(我所有的LED程序(之外的任何程序,sudo对输出没有任何影响。
当我说";用sudo"跑步";,我的意思是用苏多/a.out与之相反/a.out。我将以workingInOneFile.cpp为例。
g++ workingInOneFile.cpp -lwiringPi
./a.out
以上内容将正确编译和运行我的代码,以便我收到所需的输出。
g++ workingInOneFile.cpp -lwiringPi
sudo ./a.out
以上内容不会编译和运行我的代码,以便我收到所需的输出。无论我如何转动编码器,数字0都将被反复打印。
可能的解释
我认为这可能与wiringPi的中断系统有关,我将其用于wiringPiISR((函数,因为只有与编码器相关的程序才会有这个问题,这是它们最独特的方面。我提到的所有三个文件在类结构方面都以略有不同的方式处理编码器,它们之间的主要相似之处是,它们都使用这种中断,这在我可以使用sudo的其他文件中是找不到的。我也已经尝试过使用-o来给出一个与a.out不同的名称,但对输出没有影响。
有没有任何方法可以将这些编码器与sudo一起使用,因为我最终需要这样做,因为控制PWM引脚的唯一方法是使用sudo。
代码
workingInOneFile.cpp:
#include <wiringPi.h>
#include <iostream>
int position = 0;
unsigned char state = 0;
void update(void)
{
unsigned char currentState = state & 3;
if (digitalRead(7))
{
currentState |= 4;
}
if (digitalRead(0))
{
currentState |= 8;
}
state = currentState >> 2;
if (currentState == 1 || currentState == 7 || currentState == 8 || currentState == 14)
{
position += 1;
}
else if (currentState == 2 || currentState == 4 || currentState == 11 || currentState == 13)
{
position -= 1;
}
else if (currentState == 3 || currentState == 12)
{
position += 2;
}
else if (currentState == 6 || currentState == 9)
{
position -= 2;
}
}
void setup()
{
wiringPiSetup();
pinMode(7, INPUT);
pinMode(0, INPUT);
if (digitalRead(7))
{
state |= 1;
}
if (digitalRead(0))
{
state |= 2;
}
wiringPiISR(7, INT_EDGE_BOTH, &update);
wiringPiISR(0, INT_EDGE_BOTH, &update);
}
int read()
{
return position;
}
int main()
{
setup();
while (true)
{
std::cout << read() << "n";
}
}
test.cpp:
#include "encoder.h"
#include <iostream>
int main()
{
Encoder enc(0, 7);
while (true)
{
std::cout << enc.read() << "n";
}
}
basicInchTest.cpp:
#include "encoderL.h"
#include<iostream>
#include<cmath>
int EncoderL::position = 0;
unsigned char EncoderL::state = 0;
int main()
{
EncoderL::begin();
while(true)
{
std::cout << "Left: " << (EncoderL::read()/1440.0)*2.04*M_PI << "n";
}
}
完整的github来源:https://github.com/droiddoes9/Tennis-Ball-Robot/tree/master/General-Testing
修复:将wiringPi更新到最新版本:(