为什么 jvm 不能在 raspberry pi 上写入 gpio?
Why can't the jvm write to gpio on raspberry pi?
我有一个 java 方法,看起来像
private void exportGpio(){
String fullPath = path + "/export"; // /sys/class/gpio/export
FileWriter writer = null;
try {
writer = new FileWriter(fullPath);
writer.write("" + number);
} catch (IOException e) {
Log.e(TAG + number, "Could not export", e);
}
finally {
if(writer != null){
try {
writer.flush(); <- FAILING HERE
writer.close();
} catch (IOException e) {
Log.e(TAG + number, "Could not close writer", e);
}
}
}
}
一旦它进入刷新,它就会抛出异常
java.io.IOException: Device or resource busyjava.io.IOException:
Device or resource busy at java.io.FileOutputStream.writeBytes(Native
Method) at java.io.FileOutputStream.write(FileOutputStream.java:345)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) at
sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291) at
sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295) at
sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141) at
java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) at
lights.GPIO.exportGpio(GPIO.java:106) at
lights.GPIO.(GPIO.java:34) at
lights.LightManager.(LightManager.java:34) at
main.Main.createSubsystems(Main.java:17) at
main.Main.main(Main.java:34)
这是怎么回事? java 不能与 raspberry pi 上的系统交互吗?
不,不能这么容易直接做。
通用 I/O 引脚是一些 input/output
,我们可以在其上放置一些 High
或 Low
电压。或者我们可以从中读取一些 High
或 Low
电压。
它们不是数字端口接口,我们可以直接将数字世界的比特和字节写入其中。在 GPIO
上,您需要一些 低级编程接口 到 read/write。
这些低级编程 API 可以将您的 0
或 1
转换为某些 high
和 low
电压。
有一个名为 Pi4J 的非常优雅的库,您可以在代码中轻松使用它。他们有非常好的文档,可以帮助您使用 Raspberry PI 开发板。如果您是使用 java 等高级编程语言的程序员,它会为您提供支持 EventListeners
的基于事件的编程的良好风格,而不是从 I/O
引脚读取的轮询和中断.如果您不被迫直接在设备上工作,它是一个很好的替代选择。
希望这会有所帮助。
我确实最终弄明白了这一点。我查看了 STaefi 的答案,我认为你错了。 os 驱动程序应该处理电压。我发现 java 中的 FileWritter class 不能很好地处理这些类型的虚拟文件。我最终尝试了 java 印刷作家 class 并且一切正常。
PrintWriter writer = null;
try {
writer = new PrintWriter(fullPath, "UTF-8");
writer.write("1");
} catch (IOException e) {
Log.e(TAG + number, "Could not turn on", e);
}
finally {
if(writer != null){
try {
writer.close();
} catch (Exception e) {
Log.e(TAG + number, "Could not close writer", e);
}
}
}
我仍然不确定为什么文件编写器不起作用,但此解决方案至少可以帮助在此过程中卡在此处的任何其他人。
我有一个 java 方法,看起来像
private void exportGpio(){
String fullPath = path + "/export"; // /sys/class/gpio/export
FileWriter writer = null;
try {
writer = new FileWriter(fullPath);
writer.write("" + number);
} catch (IOException e) {
Log.e(TAG + number, "Could not export", e);
}
finally {
if(writer != null){
try {
writer.flush(); <- FAILING HERE
writer.close();
} catch (IOException e) {
Log.e(TAG + number, "Could not close writer", e);
}
}
}
}
一旦它进入刷新,它就会抛出异常
java.io.IOException: Device or resource busyjava.io.IOException: Device or resource busy at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.write(FileOutputStream.java:345) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291) at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295) at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141) at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) at lights.GPIO.exportGpio(GPIO.java:106) at lights.GPIO.(GPIO.java:34) at lights.LightManager.(LightManager.java:34) at main.Main.createSubsystems(Main.java:17) at main.Main.main(Main.java:34)
这是怎么回事? java 不能与 raspberry pi 上的系统交互吗?
不,不能这么容易直接做。
通用 I/O 引脚是一些 input/output
,我们可以在其上放置一些 High
或 Low
电压。或者我们可以从中读取一些 High
或 Low
电压。
它们不是数字端口接口,我们可以直接将数字世界的比特和字节写入其中。在 GPIO
上,您需要一些 低级编程接口 到 read/write。
这些低级编程 API 可以将您的 0
或 1
转换为某些 high
和 low
电压。
有一个名为 Pi4J 的非常优雅的库,您可以在代码中轻松使用它。他们有非常好的文档,可以帮助您使用 Raspberry PI 开发板。如果您是使用 java 等高级编程语言的程序员,它会为您提供支持 EventListeners
的基于事件的编程的良好风格,而不是从 I/O
引脚读取的轮询和中断.如果您不被迫直接在设备上工作,它是一个很好的替代选择。
希望这会有所帮助。
我确实最终弄明白了这一点。我查看了 STaefi 的答案,我认为你错了。 os 驱动程序应该处理电压。我发现 java 中的 FileWritter class 不能很好地处理这些类型的虚拟文件。我最终尝试了 java 印刷作家 class 并且一切正常。
PrintWriter writer = null;
try {
writer = new PrintWriter(fullPath, "UTF-8");
writer.write("1");
} catch (IOException e) {
Log.e(TAG + number, "Could not turn on", e);
}
finally {
if(writer != null){
try {
writer.close();
} catch (Exception e) {
Log.e(TAG + number, "Could not close writer", e);
}
}
}
我仍然不确定为什么文件编写器不起作用,但此解决方案至少可以帮助在此过程中卡在此处的任何其他人。