使用shell和Java读取和写入串行端口

时间:2013-12-24 22:44:40

标签: java shell terminal serial-port arduino

我正在尝试使用shell和java的组合来读取和写入串行端口。目标是能够使用PrintWriter和BufferedReader从连接到串行端口的设备发送和接收命令。我知道这可以用不同的方式完成(不使用shell),但这不是我想要的。我希望能够使用shell和java来做到这一点。

这是我的代码:

static String port = "/dev/tty.usbmodem411";
static int baudRate = 9600;
private static String command = "screen " + port + " " + baudRate;

public static void main(String[] args) throws Exception {
    System.out.println("Command is " + command);
    Process p = Runtime.getRuntime().exec(command);
    //p.waitFor();

    BufferedReader reader =
            new BufferedReader(new InputStreamReader(
            p.getInputStream()));
    String line = reader.readLine();
    while(true)
    {
        if (line != null) {
            System.out.println(line);

        }
        line = reader.readLine();
    }

}

使用此代码,我特意尝试从串口读取。我使用java运行shell命令来访问串口,然后从命令中读取输出。

但是,当我运行此代码时,我总会收到一条消息“必须连接到终端”。我也尝试将行command = "screen " + port + " " + baudRate;更改为command = "screen -dm" + port + " " + baudRate;,但之后我没有得到任何输出。我咨询了几个类似的问题,Executing screen command from JavaHow to open a command terminal in Linux? 但我仍然无法弄清楚我应该怎么做才能解决这个问题。我觉得它一定很简单,但经过几个小时的研究,我无法弄清楚该怎么做。

2 个答案:

答案 0 :(得分:1)

您可以使用UUCP包中的命令 cu ,而不是 screen 。 安装UUCP包sudo apt-get install uucpsudo yum install uucp

然后使用此命令: static String command = "cu -l " + port + " -s " + baudRate;

一些解释:

  • screen -d 分离会话(它在后台运行),这就是您没有看到任何数据的原因。
  • screen 需要终端,这对java来说并不容易。请参阅How to open a command terminal in Linux?

答案 1 :(得分:0)

您的描述表明您只需要访问串行端口上收到的流。您表明您希望使用shell命令来访问该端口。为什么不使用cat ...将从端口接收的内容发送到标准输出。

如果这样可行,那么为什么不能直接打开串口并直接读取它?

使用screen似乎会引入此窗口管理器提供的所有不可能正确处理的全屏处理。例如,什么终端类型应该屏幕格式化输出?