2014-09-05 62 views
0

我正在尝试使用Raspberry Pi上的GPIO pins。目前我正在使用ProcessBuilder来执行这些命令。但是,每当我运行它,它总是说:Raspberry Pi上的Java Run Shell命令

Exception in thread "main" java.io.IOException: Cannot run program "echo 18 > /sys/class/gpio/export": error=2, No such file or directory 
     at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041) 
     at Testing.initiate(Testing.java:32) 
     at Testing.main(Testing.java:8) 
Caused by: java.io.IOException: error=2, No such file or directory 
     at java.lang.UNIXProcess.forkAndExec(Native Method) 
     at java.lang.UNIXProcess.<init>(UNIXProcess.java:135) 
     at java.lang.ProcessImpl.start(ProcessImpl.java:130) 
     at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022) 
     ... 2 more 

这里是代码我使用:

ProcessBuilder pb = new ProcessBuilder("echo " + gpiopin + " > /sys/class/gpio/export"); 
    ProcessBuilder pb1 = new ProcessBuilder("echo out > /sys/class/gpio/gpio" + gpiopin + "/direction"); 
    ProcessBuilder pb2 = new ProcessBuilder("echo 1 > /sys/class/gpio/gpio" + gpiopin + "/value"); 
    pb.redirectErrorStream(true); 
    pb1.redirectErrorStream(true); 
    pb2.redirectErrorStream(true); 
    Process ps = pb.start(); 
    Process ps1 = pb1.start(); 
    Process ps2 = pb2.start(); 

这究竟是为什么?另外,如果有更好的方法做到这一点如何?

感谢

编辑:好像没有更多的错误,但命令不运行。有人可以看看我的代码,以确保我不愚蠢?

import java.util.Scanner; 


public class Testing { 
    public static void main(String[] args) throws Exception { 
     Scanner scan = new Scanner(System.in); 
     initiate(18); 

     while(true) { 
      String input = scan.nextLine(); 

      if(input.equals("on")) { 
       System.out.println("on"); 
       bellOn(); 
      }else if(input.equals("off")) { 
       System.out.println("off"); 
       bellOff(); 
      } 
     } 
    } 

    static int gpio = 18; 
    static String gp = "" + gpio; 
    static boolean initiated = false; 

    public static boolean initiate(int gpiopin) throws Exception { 
     gpio = gpiopin; 
     ProcessBuilder pb = new ProcessBuilder("echo", gp, ">", "/sys/class/gpio/export"); 
     ProcessBuilder pb1 = new ProcessBuilder("echo", "out", ">", "/sys/class/gpio/gpio" + gp + "/direction"); 
     //ProcessBuilder pb2 = new ProcessBuilder("echo", "1", ">", "/sys/class/gpio/gpio" + gpiopin + "/value"); 
     pb.redirectErrorStream(true); 
     pb1.redirectErrorStream(true); 
     //pb2.redirectErrorStream(true); 
     Process ps = pb.start(); 
     Process ps1 = pb1.start(); 
     //Process ps2 = pb2.start(); 
     initiated = true; 
     return true; 
    } 

    public static boolean bellOn() throws Exception { 
     if(initiated != true) { 
      return false; 
     }else{ 
      ProcessBuilder pb = new ProcessBuilder("echo", "0", ">", "/sys/class/gpio/gpio" + gp + "/value"); 
      pb.redirectErrorStream(true); 
      Process ps = pb.start(); 
      return true; 
     } 
    } 

    public static boolean bellOff() throws Exception { 
     if(initiated != true) { 
      return false; 
     }else{ 
      ProcessBuilder pb = new ProcessBuilder("echo", "1", ">", "/sys/class/gpio/gpio" + gp + "/value"); 
      pb.redirectErrorStream(true); 
      Process ps = pb.start(); 
      return true; 
     } 
    } 
} 
+0

找到的东西在这里,也许它可以帮助你? http://stackoverflow.com/questions/10735415/process-builder-gives-a-no-such-file-or-directory-on-mac-while-runtime-exec – Ihsan 2014-09-05 10:18:11

+0

似乎没有更多的错误,但我认为我在命令中犯了一些错误。 – cheese5505 2014-09-05 10:25:21

+0

你应该做一些类似'... new ProcessBuilder(“echo”+ gpiopin,“>”,“/ sys/class/...”);',我想。 – Ihsan 2014-09-05 10:29:22

回答

-1

这是我如何做到这一点在C++中,我敢肯定,你可以转换成Java ...

void ResetCommand::execute() { 
    // Perform a hardware reset on the Arduino using GPIO pins 
    ofstream fd; 
    char buf[255]; 

    cout << "Exporting GPIO Pin 8" << endl; 
    fd.open("/sys/class/gpio/export", ios::out); 
    fd << "8"; 
    fd.close(); 

    // Set out direction 
    cout << "Setting as output" << endl; 
    fd.open("/sys/class/gpio/gpio8/direction", ios::out); 
    fd << "out"; 
    fd.close(); 

    // Blip the reset pin 
    cout << "Resetting... " << endl; 
    fd.open("/sys/class/gpio/gpio8/value", ios::out); 
    fd << 0; 
    usleep(1); 
    fd << 1; 
    fd.close(); 

    // Finished, so free up the pin 
    cout << "Releasing " << endl; 
    fd.open("/sys/class/gpio/unexport", ios::out); 
    fd << "8"; 
    fd.close(); 
}