我正在尝试从 Java 应用程序内的子进程中的串行端口读取数据。这是我目前正在使用的代码:
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Text {
public static void main(String... arguments) throws IOException, InterruptedException {
Process pb = new ProcessBuilder().command("/bin/sh", "-c", "(stty raw; cat) < /dev/ttyAMA0").start();
final Scanner scanner = new Scanner(new InputStreamReader(new BufferedInputStream(pb.getInputStream())));
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
}
});
t.start();
pb.waitFor();
}
}
想法如下:我不想依赖操作系统(这里是 Raspberry Pi 上的 Raspbian)从串行端口向我发送原始输入。因此,我启动了一个子进程,该子进程使用 stty 将串行端口设置为 RAW 模式,并使用 cat 转发数据。这个技巧在命令行上完美运行。如果我随后将 stdout 重定向到 Java 程序,则数据会正确地流向其输入流。
这里的问题是,使用此代码将数据获取到子进程(不是 Java 程序的标准输入,你猜对了),我正在丢失字符。我期望 10 个 3 位数字的行,用逗号分隔,我得到 4 到 6 个数字,有时后面跟一个逗号。
我认为存在缓冲问题,我的 Java 应用程序可能无法清空(非常有限的)串行端口缓冲区。
有什么我可以在 Java 方面做的明智的事情,或者我应该在这里向 Linux 内核极客寻求一些操作系统技巧吗?
谢谢,
马修