某个程序只有在 运行 时我不使用 sudo 时才有效

A certain program only works if I do NOT use sudo when running

问题

我有一个问题,如果我 运行 使用 sudo 的程序,我没有得到想要的输出,但是如果我 运行 没有 sudo,它工作正常。我在 C++ 中使用 raspberry pi,使用 wiringPi 访问 GPIO。该程序最终将涉及使用 PWM 引脚来设置电机功率,为此 wiringPi 需要 使用 sudo。所以,我 需要 在 运行 运行这个程序时使用 sudo。

但是,如果 运行 使用 sudo,任何使用我正在使用的代码从编码器获取读数的程序都不起作用,但其他一切都可以使用 sudo。例如,如果我 运行 BETA/basicInchTest.cpp、My-own-encoder/workingInOneFile.cpp 或 My-own-encoder/test.cpp 使用 sudo,它们只会打印 0,但如果我 运行 如果没有 sudo,它们将提供所需的输出,打印编码器的位置。如果我 运行 除了那些处理编码器的程序(我所有的 LED 程序)之外的任何程序,sudo 对输出没有影响。

当我说“运行 sudo”时,我的意思是使用 sudo ./a.out 而不是 ./a.out。我将以 workingInOneFile.cpp 为例。

g++ workingInOneFile.cpp -lwiringPi 
./a.out

以上将正确编译和 运行 我的代码,以便我收到所需的输出。

g++ workingInOneFile.cpp -lwiringPi 
sudo ./a.out

以上代码不会编译 运行 我的代码,因此我会收到所需的输出。无论我如何转动编码器,数字 0 都会一遍又一遍地打印出来。

可能的解释

我认为这可能与我在 wiringPiISR() 函数中使用的 wiringPi 中断系统有关,因为只有与编码器相关的程序才会出现此问题,这是它们最独特的方面。我提到的所有三个文件在 class 结构方面以略有不同的方式处理编码器,并且它们之间的主要相似性在我可以使用 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 更新到最新版本:)