I'm trying to read the output of sam-ba.exe (which loads code to ARM microcontrollers over USB) into my Java program. When writing this exact command in command prompt:
"sam-ba_3.2.1\sam-ba.exe" -p usb -d SAME70 -a internalflash
The result is:
Error: No serial ports found
But when executing this command in the following Java code, nothing is returned from either the standard output or standard error streams (see the following):
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):
What makes it more annoying is that substituting this command in the Java code wil return information in the stderr stream:
"sam-ba_3.2.1\sam-ba.exe" --help
The result:
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>.
In the console, I tried redirecting the output of the first (non-working) command to a text file, and the text file displays the expected Error no serial ports, but only if the following command is used:
"sam-ba_3.2.1\sam-ba.exe" -p usb -d SAME70 -a internalflash > output.txt 2>&1
This leads me to believe that the message is coming from stderr because if I omit the "2>&1", the text file is blank. But then why is stderr in the Java program blank?
Here is my Java code:
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();
}
}
}
Any help would be great,
Judd
Update: As suggested I am now using ProcessBuilder and removed the quotes, but the result is exactly the same.
A suggestion was made to add Redirect.INHERIT
as shown, but it produces the following output. It looks like it just bypasses the input streams and goes straight to the terminal?
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();
}
}
}
Output:
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