某个程序只有在 运行 时我不使用 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 更新到最新版本:)
问题
我有一个问题,如果我 运行 使用 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 更新到最新版本:)