Я пытаюсь прочитать вывод sam-ba.exe (который загружает код в микроконтроллеры ARM через USB) в мою Java-программу.При написании этой точной команды в командной строке:
"sam-ba_3.2.1\sam-ba.exe" -p usb -d SAME70 -a internalflash
Результат:
Error: No serial ports found
Но при выполнении этой команды в следующем Java-коде из также ничего не возвращается стандартный вывод или стандартные потоки ошибок (см. Следующее):
Command executed: "sam-ba_3.2.1\sam-ba.exe" -p usb -d SAME70 -a internalflash
Here is the standard output of the command:
Here is the standard error of the command (if any):
Что делает более раздражающим то, что замена этой команды в коде Java будет возвращать информацию в потоке stderr:
"sam-ba_3.2.1\sam-ba.exe" --help
Результат:
Here is the standard output of the command:
Here is the standard error of the command (if any):
SAM-BA Command Line Tool v3.2.1
Copyright 2015-2017 ATMEL Corporation
Usage: sam-ba_3.2.1\sam-ba.exe [options]
Options:
-v, --version Displays version information.
-h, --help Displays this help.
-t, --tracelevel <trace_level> Set trace level to <trace_level>.
-x, --execute <script.qml> Execute script <script-file>.
-p, --port <port[:options:...]> Communicate with device using <port>.
-d, --device <device[:options:...]> Connected device is <device>.
-b, --board <board[:options:...]> Connected board is <board>.
-m, --monitor <command[:options:...]> Run monitor command <command>.
-a, --applet <applet[:options:...]> Load and initialize applet <applet>.
-c, --command <command[:args:...]> Run command <command>.
В консоли я попытался перенаправить вывод первой (нерабочей) команды в текстовый файл, и в текстовом файле отображается ожидаемая ошибка №последовательные порты, но только если используется следующая команда:
"sam-ba_3.2.1\sam-ba.exe" -p usb -d SAME70 -a internalflash > output.txt 2>&1
Это заставляет меня поверить, что сообщение исходит от stderr, потому что если я опущу "2> & 1", текстовый файл будет пустым.Но тогда почему stderr в программе Java пуст?
Вот мой код Java:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.BufferedReader;
public class ProcessDemo {
public static void main(String[] args) {
try
{
Runtime r = Runtime.getRuntime();
//String command = "\"sam-ba_3.2.1\\sam-ba.exe\" --help";
String command = "\"sam-ba_3.2.1\\sam-ba.exe\" -p usb -d SAME70 -a internalflash";
System.out.println("Command executed: " + command);
Process proc = r.exec(command);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
// read the output from the command
System.out.println("Here is the standard output of the command:\n");
String s = null;
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Любая помощь будет отличной,
Judd
Обновление: Как и предполагалось, я сейчас использую ProcessBuilder и удалил кавычки, но результат точно такой же.
Было предложено добавить Redirect.INHERIT
, как показано, но это приводит кследующий вывод.Похоже, он просто обходит входные потоки и идет прямо к терминалу?
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedReader;
public class ProcessDemo {
public static void main(String[] args) {
try
{
// String[] command = {"sam-ba_3.2.1\\sam-ba.exe","--help"};
String[] command = {"sam-ba_3.2.1\\sam-ba.exe", "-p", "usb", "-d", "SAME70", "-a", "internalflash", "-c", "write:\"GCCBoardProject1.bin\""};
ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
Process proc = pb.start();
proc.waitFor();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
System.out.println("Here is the standard output of the command:\n");
// read the output from the command
String s = null;
while ((s = stdInput.readLine()) != null)
{
System.out.println(s);
}
// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null)
{
System.out.println(s);
}
System.out.println("return value: " + proc.exitValue());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Вывод:
Error: No serial ports found
Here is the standard output of the command:
Here is the standard error of the command (if any):
return value: -1